Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何避免或修复PHP警告:打开的文件太多_Php_Linux - Fatal编程技术网

如何避免或修复PHP警告:打开的文件太多

如何避免或修复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

我在Fedora上运行PHP5.2,在循环大约1000次之后,我一直收到这个警告,这意味着程序已经停止工作,需要重新启动。我可以将其设置为在1000次迭代后退出,然后很快通过cron重新启动,但这感觉像是懦夫的出路。循环如下;我应该添加
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_文件真的是绝对文件系统路径吗?