我有一个从命令行运行的长时间(复杂)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
,而是始终关闭并再次打开它!(你会得到混乱的输出!)