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
Разбить задачу на более мелкие куски. Используйте базу данных, чтобы сохранить "состояние" фактического выполнения задания.
Преимущество такого подхода состоит в том, что он масштабируемый: вы, вероятно, будете вынуждены отправлять больше писем по мере роста, не так ли?