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


Redirect php output (cli) opens many file handles

我有一个从命令行运行的长时间(复杂)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

有人有主意吗?(或者一些我可以尝试的东西?)

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

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

这是在一个循环中完成的(因为curl实例被重用了——请参见此处)。

因此,解决方案是:将句柄存储到stdout并关闭它:

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

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