У меня есть свой собственный скрипт PHP для отправки бюллетеня. Это сработало отлично. Недавно мой хостинг-провайдер указал мне квоту уважения: 30 писем в минуту. Итак, между каждой отправкой почты я вставляю sleep(2);
,
После этого изменения через 5 минут (300 секунд) скрипт останавливается и возвращает:
Сервис недоступен
Сервер временно не может обслуживать ваш запрос из-за простоев или проблем с пропускной способностью. Пожалуйста, попробуйте позже.
Кроме того, при попытке использовать ErrorDocument для обработки запроса произошла ошибка 503 Service Unavailable.
Четыре наблюдения.
В начале моего сценария я поместил эти две строки:
ignore_user_abort(true);
set_time_limit(0);
Итак, проблема не в переменной max_execution_time (я проверяю: она действительно изменена).
Скрипт корректно работает на localhost
где переменные ini PHP более ограничены, чем на моем веб-хосте. Таким образом, проблема исходит не от memory_limit
переменная.
Я думал, что это может быть предел переменной Apache Timeout (300). Но мой хост-провайдер скептически относится к этому …
Сервер работает на PHP 5.5.
Что может быть причиной этого?
Скрипт ранее (он работает с PHPMailer):
// all email addresses
while ($row = $result->fetch_array())
{
// ...
if ($mail->send())
{
echo "success : " . $row["mail"] . "<br/>";
}
else
{
echo "error : " . $row["mail"] . " - " . $mail->ErrorInfo . "<br/>";
}
}
После :
// all email addresses
while ($row = $result->fetch_array())
{
...
if ($mail->send())
{
echo "success : " . $row["mail"] . "<br/>";
}
else
{
echo "error : " . $row["mail"] . " - " . $mail->ErrorInfo . "<br/>";
}
sleep(2);
}
Я думаю на сервере используются mod_fastcgi или equals.
Посмотрите на этот старый пост http://www.binarytides.com/php-set-time-limit/
Например, у mod_fastcgi есть опция с именем «-idle-timeout», которая контролирует время простоя скрипта. Так что если сценарий ничего не выводит в обработчик fastcgi в течение этого количества секунд, то fastcgi завершит его. Настройка выглядит примерно так:
Apache <-> mod_fastcgi <-> php processes
Вы должны использовать очередь и crontab, которые очередь обрабатывает один раз в минуту.
Надеюсь это поможет.
Это может быть несколько вещей, даже права доступа к файлу. Сначала я отменил бы ваши изменения и посмотрел, работает ли он снова. Если нет, то вы знаете, что это не команда sleep (), вызывающая проблему. Если это команда sleep, проблема может быть связана с тайм-аутом в ожидании ответа php. Вместо этого попробуйте спать в течение 0,1 секунды, просто чтобы проверить, работает ли он.