Причины неудачной команды PHP - PullRequest
3 голосов
/ 06 апреля 2011

У меня есть пакетный процесс электронной почты, который отправляет около 30 000 сообщений электронной почты.Я столкнулся со странной проблемой, когда доходит до завершения процесса примерно на 85%, а затем начинается сбой электронной почты с сообщением Could not execute: /usr/sbin/sendmail Я использую библиотеку с именем PHPMailer 1.73 и соответствующий код, из которого приходит сообщение об ошибке:

if(!@$mail = popen($sendmail, "w"))
{
    $this->SetError($this->Lang("execute") . $this->Sendmail);
    return false;
}

Значение $sendmail имеет вид: /usr/sbin/sendmail -oi -f support1@example.com -t

У меня есть set_time_limit(0);, поэтому сценарий не остановится.

Есть ли в любом случаевыяснить, почему внезапно происходит сбой popen ()?Может быть, в ОС заканчиваются дескрипторы файлов или достигнут какой-то другой предел?

Как мне решить эту проблему?Стоит ли мне поспать и затем несколько раз повторить попытку popen (), прежде чем произойдет сбой?

Обновление : Благодаря предложению Марко проверить proc_open() Я нашел на Документация proc_open комментарий, что если он возвращает FALSE, это, вероятно, означает, что у вас закончились файловые дескрипторы или у вас недостаточно памяти.Я обнаружил, что мой процесс занимал 20G памяти.Но как это может занять столько памяти, если memory_limit установлено на 64M?Что ж, похоже, что запуск внешних программ с exec(), popen() или proc_open() НЕ учитывается при ограничении памяти PHP.См. Этот вопрос SO для получения дополнительной информации об этом, Отладка использования памяти в mod_php .Я все еще не уверен, как это происходит, но я подозреваю, что какая-то утечка памяти.

В итоге, popen() и proc_open() могут вернуть FALSE, если у вас нет файловых дескрипторов или недостаточно памяти.

1 Ответ

2 голосов
/ 07 апреля 2011

Я бы рекомендовал использовать proc_open.Это немного сложнее в использовании, но дает вам доступ к stdout и stderr.Сообщения на этих двух каналах сэкономят вам много времени на отладку.

Как использовать, просто прочитайте примеры и комментарии в документации PHP.

...