Предупреждение PHP: слишком много открытых файлов - есть идеи? - PullRequest
3 голосов
/ 25 февраля 2009

Я использую PHP 5.2 на Fedora и продолжаю получать это предупреждение после примерно 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 ]

4 голосов
/ 25 февраля 2009

Вы должны закрыть указатель после использования его с pclose.

2 голосов
/ 25 февраля 2009

Попробуйте закрывать процесс каждый раз после записи в него с помощью pclose ().

1 голос
/ 21 октября 2014

У меня недавно была эта проблема при использовании Xdebug и PhpStorm (на Mac). Здесь есть открытая ошибка:

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

и

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

0 голосов
/ 25 февраля 2009

Я знаю, вы сказали, что get_load() использует file_get_contents(), но чтобы убедиться ... правильно ли он закрывает все файлы, которые он открывает? Не могли бы вы опубликовать код из этой функции?

Редактировать: хотя это встроенная функция, попробуйте использовать что-то отличное от file_get_contents(), чтобы прочитать файл и посмотреть, что произойдет.

0 голосов
/ 25 февраля 2009

popen может вернуть только две вещи, либо ресурс, либо FALSE. Может быть, вы должны проверить FALSE вместо is_resource? Вы пропускаете файловые дескрипторы, поэтому очевидная вещь, которую нужно проверить, - это убедиться, что вы всегда закрываете файл, когда открываете его, а очевидным местом, где вы открываете файловые дескрипторы, является вызов popen. Проследите свою логику и убедитесь, что вы не пропускаете закрытие этих каналов ни из-за логической ошибки, ни из-за исключения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...