PHP & amp; cPanel: Как предотвратить отскок, когда письмо отправляется в PHP и возникает ошибка?

Электронные письма успешно передаются в сценарий 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();
?>

1

Решение

Не уверен, что здесь есть вопрос, но почтовый процессор возвращает сообщение, потому что, когда скрипт PHP завершается ненормально из-за ошибки, процесс PHP возвращает ненулевое значение (в данном случае 255) оболочке.

Когда ваш MTA, который отправил электронное письмо в ваш скрипт, обнаруживает, что произошел сбой, исходя из того, что его возвращаемое значение> 0, он считает его неудачным и возвращает сообщение (возможно, включая любой вывод скрипта в сообщение о сбое).

Если вы не можете (или не хотите) изменять максимальное время выполнения для этих переданных по конвейеру процессов, одним из решений будет постановка в очередь сообщения для обработки каким-либо другим сценарием, где вы можете разбить обработку на части или увеличить время предел.

С помощью register_shutdown_function() а также set_error_handler() Мне не удалось переопределить возвращаемое значение PHP для тайм-аута, используя exit(0) так что это, вероятно, не будет обходным путем.

Вы должны быть в состоянии увеличить время с set_time_limit если ваш PHP не работает в безопасном режиме, не позволяя ему сделать это. Но если процессы действительно долго работают, может быть лучше поставить сообщения в очередь для обработки, а не пытаться обрабатывать сообщения по мере их поступления, поскольку это может привести к узким местам или перегрузкам сервера.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]