如何避免或修复PHP警告:打开的文件太多
我在Fedora上运行PHP5.2,在循环大约1000次之后,我一直收到这个警告,这意味着程序已经停止工作,需要重新启动。我可以将其设置为在1000次迭代后退出,然后很快通过cron重新启动,但这感觉像是懦夫的出路。循环如下;我应该添加如何避免或修复PHP警告:打开的文件太多,php,linux,Php,Linux,我在Fedora上运行PHP5.2,在循环大约1000次之后,我一直收到这个警告,这意味着程序已经停止工作,需要重新启动。我可以将其设置为在1000次迭代后退出,然后很快通过cron重新启动,但这感觉像是懦夫的出路。循环如下;我应该添加get\u load()执行file\u get\u contents()调用 while ($row = select_row($sql)) { while (($load = get_load()) > 10) { ech
get\u load()
执行file\u get\u contents()
调用
while ($row = select_row($sql))
{
while (($load = get_load()) > 10)
{
echo "Going to sleep (load: ".$load.")\n";
sleep(60*3);
}
$id = $row['id'];
foreach ($sizes as $abbr=>$size)
{
if($row[$size] != "yes")
{
continue;
}
$filename = "/images/".$abbr."/".$id.".jpg";
$tmp_file = "/tmp/".$id.".jpg";
if ($size == "large")
{
//We want to progressively interlace our large bookcovers because it saves on filesave above 10K.
$cmd = "convert -strip -interlace Plane ".$filename." ".$tmp_file;
}
else
{
$cmd = "convert -strip ".$filename." ".$tmp_file;
}
$convert = popen($cmd." 2>&1", "r");
if (is_resource($convert))
{
echo fgets($convert);
if(pclose($convert) == 0)
{
//Upload converted file to remote server
}
unlink($tmp_file);
}
}
编辑:在阅读了前两个答案后,我意识到在取出与我的问题无关的文件上载代码时,我取出了我的pclose()
语句。按“我的代码”中的显示,放入pclose()
进一步编辑:按要求发布get\u load()
function get_load()
{
$load = explode(" ", file_get_contents("/proc/loadavg"));
return $load[0];
}
每次使用pclose()写入进程后,请尝试关闭该进程。在将指针与一起使用后,应关闭该指针。popen只能返回两个内容,一个是资源,另一个是FALSE。也许你应该测试FALSE而不是is_资源?您正在泄漏文件句柄,因此需要检查的一件明显的事情是确保在打开文件后始终关闭它,而打开文件句柄的明显位置是popen调用。跟踪您的逻辑,确保您没有因为逻辑错误或异常而跳过关闭这些管道。我知道您说过
get\u load()
使用file\u get\u contents()
,但为了确保…它是否正确关闭了它打开的所有文件?你能把那个函数的代码发出来吗
编辑:即使它是一个内置函数,也可以尝试使用
文件\u get_contents()
以外的其他工具来读取文件并查看结果。我最近在使用Xdebug和PhpStorm(在Mac上)时遇到了这个问题。这里有一个开放的bug:
及
如何关闭不是资源的东西?在该脚本的早期版本中,PHP因试图关闭非资源的内容而发出警告。我尝试将pclose放入else中进行is_资源检查,警告开始后,当我尝试关闭非资源指针时,它也开始出错。
file_get_contents
是PHP中的内置函数。如果在读取文件内容后不关闭该文件,那就太鲁莽了。PHP5已经有了一个sys\u getloadavg
函数:此外:我怀疑你的convert
调用是否有效。或者$filename和$tmp_文件真的是绝对文件系统路径吗?