【问题标题】:Redirect php output (cli) opens many file handles重定向php输出(cli)打开许多文件句柄
【发布时间】:2014-11-04 19:24:09
【问题描述】:

我有一个从命令行运行的长时间运行(复杂)的 php 脚本:

php myscript.php 2> myscript.err.out > myscript.out &

由于某种原因,这会打开许多​​(系统级)文件句柄 - 即 lsof | grep myscript.out | wc -l 会增加直到达到限制。

当然可以增加限制(通过ulimit),但我真的需要找到原因,因为实际上应该只有一个文件句柄打开该文件。 (即增加只会延迟问题)

因为我无法精简到一个最小的例子 - 这里有一些特征:

  • 打开文件的数量与以下两个操作密切相关:
    • 打开(和关闭!)临时文件(通过tempnam
    • 将这些临时文件存储在 MongoDB 中
  • 系统:SMP Debian 3.14.15-2

有人知道吗? (或者我可以尝试一些事情?)

【问题讨论】:

  • 很难说没有看到代码中的所有内容可能会打开文件、套接字、命名管道等或访问lsof 列出的设备
  • 但是由于我没有在我的脚本中打开一个名为 myscript.out 的文件,所以这不会影响 lsof 上的 grep。我错了吗?

标签: php file curl


【解决方案1】:

经过多次尝试,我可以将问题深入到:

curl_setopt($ch, CURLOPT_FILE, fopen('php://stdout', 'w'));

这是在循环中完成的(因为 curl 实例被重复使用 - 请参阅 here)。

所以解决方法是:将句柄存储到stdout并关闭它:

if (isset($stdout) && is_resource($stdout)) {
  fclose($stdout);
}
$stdout = fopen('php://stdout', 'w');
curl_setopt($ch, CURLOPT_FILE, $stdout)

注意:您应该直接重复使用$stdout,但始终关闭并再次打开它! (你会得到混乱的输出!)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    相关资源
    最近更新 更多