Электронные письма успешно передаются в сценарий PHP посредством фильтрации пользователей электронной почты cPanel, но сценарий PHP имеет ограничение по времени выполнения (для предотвращения DoS). Когда возникает ошибка ограничения времени, электронная почта возвращается.
Хотя это и является ошибкой PHP, что вызывает подпрыгивание, ошибку практически невозможно исправить, поэтому существует ограничение по времени.
Пример отказов:
Это сообщение было создано автоматически программой доставки почты.
Не удалось доставить отправленное вами сообщение одному или нескольким
получатели. Это постоянная ошибка. Следующий адрес (а)
не удалось:канал к | / usr / bin / php -q /home/foo/bar/script.php
генерируется [email protected]
локальная доставка не удалась—— Это копия сообщения, включая все заголовки. ——
—— Тело мессы […]
Первое, что можно подумать, это то, что ошибка ограничения времени выполнения — это печать сообщения (которое автоматически вызовет отказ), но это не так, потому что ini_set('display_errors', false);
установлено. Доказательством того, что ничего не печатается, является отсутствие «Следующий текст был сгенерирован во время попытки доставки: …» в сообщении, указанном выше.
Небольшой тест:
#!/usr/bin/php -q
<?php
set_time_limit(1);
ini_set('display_errors', false);
$fh_stdin = fopen('php://stdin', 'rb');
while (true) rand();
?>
Не уверен, что здесь есть вопрос, но почтовый процессор возвращает сообщение, потому что, когда скрипт PHP завершается ненормально из-за ошибки, процесс PHP возвращает ненулевое значение (в данном случае 255) оболочке.
Когда ваш MTA, который отправил электронное письмо в ваш скрипт, обнаруживает, что произошел сбой, исходя из того, что его возвращаемое значение> 0, он считает его неудачным и возвращает сообщение (возможно, включая любой вывод скрипта в сообщение о сбое).
Если вы не можете (или не хотите) изменять максимальное время выполнения для этих переданных по конвейеру процессов, одним из решений будет постановка в очередь сообщения для обработки каким-либо другим сценарием, где вы можете разбить обработку на части или увеличить время предел.
С помощью register_shutdown_function()
а также set_error_handler()
Мне не удалось переопределить возвращаемое значение PHP для тайм-аута, используя exit(0)
так что это, вероятно, не будет обходным путем.
Вы должны быть в состоянии увеличить время с set_time_limit
если ваш PHP не работает в безопасном режиме, не позволяя ему сделать это. Но если процессы действительно долго работают, может быть лучше поставить сообщения в очередь для обработки, а не пытаться обрабатывать сообщения по мере их поступления, поскольку это может привести к узким местам или перегрузкам сервера.
Других решений пока нет …