PHP警告:打开文件太多 - 任何想法?

时间:2009-02-25 19:05:25

标签: php linux

我在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];
}

5 个答案:

答案 0 :(得分:4)

使用pclose后,应关闭指针。

答案 1 :(得分:2)

每次使用pclose()写入后,请尝试关闭该过程。

答案 2 :(得分:1)

最近在使用Xdebug和PhpStorm(在Mac上)时遇到了这个问题。这里有一个开放的错误:

http://bugs.xdebug.org/view.php?id=1070

https://youtrack.jetbrains.com/issue/WI-25307

答案 3 :(得分:0)

popen只能返回两个东西,无论是资源还是FALSE。也许你应该测试FALSE而不是is_resource?您正在泄漏文件句柄,因此要检查的显而易见的事情是确保在打开文件时始终关闭文件,并且打开文件句柄的明显位置是popen调用。跟踪您的逻辑并确保您不会以某种方式跳过关闭这些管道,无论是通过逻辑错误还是异常。

答案 4 :(得分:0)

我知道您说get_load()使用file_get_contents(),但要确保...是否正确关闭了它打开的所有文件?你可以发布该功能的代码吗?

编辑:尽管它是一个内置函数,但请尝试使用file_get_contents()之外的其他内容来读取文件,看看会发生什么。