我在Fedora上运行PHP 5.2,并且在我的循环大约1000次迭代后我不断收到此警告,这意味着程序已停止工作并需要重新启动。我可以将其设置为在1000次迭代后退出并在此后不久通过cron重新启动,但这感觉就像胆小鬼的出路一样。循环如下;我应该补充一点get_load()
预先形成file_get_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_load()
function get_load()
{
$load = explode(" ", file_get_contents("/proc/loadavg"));
return $load[0];
}
答案 0 :(得分:4)
使用pclose
后,应关闭指针。
答案 1 :(得分:2)
每次使用pclose()写入后,请尝试关闭该过程。
答案 2 :(得分:1)
答案 3 :(得分:0)
popen只能返回两个东西,无论是资源还是FALSE。也许你应该测试FALSE而不是is_resource?您正在泄漏文件句柄,因此要检查的显而易见的事情是确保在打开文件时始终关闭文件,并且打开文件句柄的明显位置是popen调用。跟踪您的逻辑并确保您不会以某种方式跳过关闭这些管道,无论是通过逻辑错误还是异常。
答案 4 :(得分:0)
我知道您说get_load()
使用file_get_contents()
,但要确保...是否正确关闭了它打开的所有文件?你可以发布该功能的代码吗?
编辑:尽管它是一个内置函数,但请尝试使用file_get_contents()
之外的其他内容来读取文件,看看会发生什么。