2016-12-05 2 views
1

У меня есть собственный PHP-скрипт для отправки информационного бюллетеня. Он отлично работал. Недавно мой хостинг-провайдер указывает мне квоту на уважение: 30 писем/минуту. Таким образом, между каждой отправкой почты я вставляю sleep(2);.PHP-скрипт перестает работать с 503 недоступным сервисом

С этого изменения, через 5 минут (300 секунд), сценарий остановки и возвращения:

Service Unavailable

Сервер временно не в состоянии обслуживать ваш запрос из-за простоя обслуживания или проблемы пропускной способности , Пожалуйста, повторите попытку позже. Кроме того, при попытке использовать ErrorDocument для обработки запроса была обнаружена ошибка 503 Service Unavailable.

Четыре наблюдения.

  1. В начале моего сценария, я ставлю эти две линии:

    ignore_user_abort(true); 
    set_time_limit(0); 
    

    Таким образом, проблема исходит не от переменной max_execution_time (я проверяю: она действительно изменяется).

  2. Сценарий работает правильно на localhost, где переменные PHP ini более ограничены, чем на моем веб-хосте. Таким образом, проблема возникает не из переменной memory_limit.

  3. Я думал, что это может быть ограничение переменной времени Apache Timeout (300). Но мой провайдер является скептически настроен об этом ...

  4. Сервер работает на 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); 
} 
+1

Вы могли бы включить * скрипт, который не работает ...? мы еще не совсем ясновидящие. –

+0

Я улучшил форматирование вашего вопроса, чтобы было легче читать. Пожалуйста, просмотрите документацию по форматированию Stack Overflow в [справочном центре] (https://stackoverflow.com/help/formatting), чтобы вы могли сделать это самостоятельно в следующий раз. Обратите внимание, что в блоках кода внутри списка должны быть отступы четыре пробела для каждого уровня списка плюс дополнительные четыре пробела для указания блока кода. – Chris

ответ

0

Я думаю, что на mod_fastcgi сервера или используются равны.

Взгляните на этот старый пост http://www.binarytides.com/php-set-time-limit/

Например mod_fastcgi имеет опцию под названием «-idle-тайм-аут», который контролирует время простоя сценария. Поэтому, если скрипт ничего не выводит на обработчик fastcgi за это много секунд, то fastcgi завершает его. Установка примерно так:

Apache <-> mod_fastcgi <-> php processes 

Вы должны использовать очередь и кронтаб, что очередь обрабатывается один раз в минуту.

Надеюсь, это поможет.

+0

При каждой отправке почты скрипт выдает адрес электронной почты ... Итак, нет простоя (время простоя), не так ли? Apache запускается на моем сервере через lsphp (litespeed). – Jiphou

+0

Я еще не использовал lsphp. Выполняет выполнение скрипта из командной строки, например 'php send_mails.php'. – rengaw83

+0

Я тестировал решение «rengaw83». Через 5 минут все еще перерыв ... На самом деле, это не litespeed, а mod_lsapi. Ограничений на Apache нет, поэтому мой хост-провайдер (они удалили все ограничения Apache) ... Я попробую командную строку. – Jiphou

0

Это действительно может быть несколько вещей, даже прав доступа к файлам. Сначала я отменил бы ваши изменения и посмотрю, снова ли это работает.Если нет, то вы знаете, что это не команда sleep(), которая вызывает проблему. Если это команда спящего режима, проблема может иметь какое-то отношение к таймауту, ожидая ответа php. Попробуйте спать в течение 0,1 секунды вместо этого, чтобы проверить, работает ли он.

Смежные вопросы