У меня есть пакетный процесс электронной почты, который отправляет около 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
, если у вас нет файловых дескрипторов или недостаточно памяти.