重定向php输出(cli)打开许多文件句柄

时间:2014-11-04 19:24:09

标签: php file curl

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

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

对于一些reasone,这会打开许多​​(系统级)文件句柄 - 即lsof | grep myscript.out | wc -l正在增加,直到达到限制。

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

由于我无法减少一个最小的例子 - 这里有一些特征:

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

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

1 个答案:

答案 0 :(得分:0)

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

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但始终关闭并再次打开它! (你会搞砸输出!)