我有一个脚本可以发送300-500封电子邮件包。这意味着此脚本将使用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";
评论
答案 0 :(得分:5)
如果你的脚本是用cron启动的,那就意味着你正在使用PHP-CLI“PHP命令行界面”。
正如PHP documentation中所述,使用CLI时没有时间限制。
所以您不必担心:max_execution_time
设置为unlimited
。
答案 1 :(得分:1)
只是要仔细检查你是否无法设置执行时间,这里有两个建议。
您可以在发送电子邮件之前致电set_time_limit()
。根据{{3}}:
调用时,set_time_limit()从零重新启动超时计数器。换句话说,如果超时是默认的30秒,并且脚本执行25秒,则进行诸如set_time_limit(20)之类的调用,脚本将在超时之前运行总共45秒。
例如:
foreach ($emails as $email) {
set_time_limit(30);
send($email, ...);
}
另一种选择是通过cron。由于您是从cron作业运行PHP,因此可以PHP docs。您可以按如下方式执行脚本:
php -c /custom/directory/my_php.ini my_script.php
my_php.ini
可指定的位置:
max_execution_time = 0 ; (unlimited)
答案 2 :(得分:0)
以较小的块分解任务。使用数据库保持实际作业执行的“状态”。
这种方法具有可扩展性的优势:您可能最终不得不随着成长发送更多电子邮件,不是吗?