我在php中运行一个foreach循环,执行时间比我30秒的最大执行时间长。循环向用户发送单独的电子邮件。
不是每30秒运行一次cron作业并为记录创建队列,而是使用set_time_limit(30)
在循环中重新启动计数器是不道德的?
$i = 0; //start count from 0
foreach ($users as $user):
//limit emails sent
if(++$i == 100) break; //ends execution of loop
set_time_limit(30); //restart timeout counter
send_email($user); //send email to user
endforeach;
我是新手,但是根据上面的代码,我想我会给每封电子邮件30秒完成,但也会在发送100封电子邮件时打破循环,因此脚本不会永远运行。
更新: set_time_limit(0)
反对托管TOS,我相信重新启动超时计数器会重启脚本以及CRON
答案 0 :(得分:4)
在set_time_limit
循环中运行foreach
,同时带来并解决了一些问题。
我认为这个解决方案中最伟大的专业人员确保没有任何请求需要超过30秒的时间(并且当你有一个完整的提示时,我相信甚至需要削减花费那么长时间的每个脚本)。
它带来的问题是,所有工作都不会被执行。也许你会在作业队列中遇到一些问题而且都会失败。
我会这样做:
# crontab
0,30 * * * * php /path/to/your/script.php
并使用你的剧本。
如果你需要尽快执行作业,我会创建一个bash脚本,只要它不能用exit(0)
完成就会执行(没有任何超时)php脚本(所有作业都成功执行) )或不会返回"Done!"
或任何你喜欢的内容。
#!/bin/bash
# Note that false sets $? to 1
false
while [ $? -ne 0 ]; do
php /path/to/your/script.php >> log.log
done
如果你需要确保不会同时运行两个实例,请谷歌中的一个(仅限于我的头脑):
.pid
档案LOCK TABLE
PS:如果您使用某些方法,请确保您的脚本在中间崩溃时可以正常运行
答案 1 :(得分:2)
只需在脚本开头一起禁用所有时间限制:
set_time_limit(0);
答案 2 :(得分:0)
如果主持人的TOS阻止使用无限制的脚本,他们几乎肯定会反对重置脚本。唯一的选择是并行发送电子邮件,或移动到其他主机。