Php предотвращает максимальное время выполнения для почты

У меня есть script, чтобы отправлять пакеты из 300-500 писем в час. Это означает, что этот script будет запускаться один раз в час с помощью cron или другой функции.

Сервер имеет максимальный предел выполнения 30 секунд и не настраивается.

Я думал, должен ли работать псевдо-код ниже:

$time=time();
$count=0;
while(condition){
    $count++;
    send(email);
    $now=time();
    if($now-$time>=29){break;} //1sec margin
}
echo "$count e-mails sent";

мнения?

Ответ 1

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


Вы можете просто позвонить set_time_limit() перед отправкой электронной почты. Согласно PHP docs:

При вызове set_time_limit() перезапускает счетчик тайм-аута с нуля. Другими словами, если таймаутом является значение по умолчанию 30 секунд и 25 секунд в script выполняется вызов, такой как set_time_limit (20), script будет работать в общей сложности за 45 секунд до выключения тайм-аута.

Например:

foreach ($emails as $email) {
    set_time_limit(30);
    send($email, ...);
}

Другой вариант - через cron. Поскольку вы используете PHP из задания cron, вы можете указать свой собственный php.ini. Вы можете выполнить свой script следующим образом:

php -c /custom/directory/my_php.ini my_script.php

Где my_php.ini может указывать:

max_execution_time = 0     ; (unlimited)

Ответ 2

если ваш script запущен cron, это означает, что вы используете PHP-CLI "Интерфейс командной строки PHP".

Как упоминалось в документации PHP, у вас нет ограничений по времени при использовании CLI.

Итак, вам не о чем беспокоиться: max_execution_time установлен в unlimited.

Ответ 3

Разбить задачу на более мелкие куски. Используйте базу данных, чтобы сохранить "состояние" фактического выполнения задания.

Преимущество такого подхода состоит в том, что он масштабируемый: вы, вероятно, будете вынуждены отправлять больше писем по мере роста, не так ли?