我在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 一样重新启动脚本
在foreach
循环中运行set_time_limit
,同时带来并解决了一些问题。
我认为这个解决方案的最大优点是确保任何请求的时间都不会超过30秒(当你有了完整的提示时,我认为甚至最好剪掉每一个需要那么长时间的脚本)。
它带来的问题是,并非所有作业都必须执行。也许你会在工作队列中间遇到一些问题,这一切都会失败。
我会选择这个:
# crontab
0,30 * * * * php /path/to/your/script.php
并且会使用你的脚本。
如果你需要尽可能快地执行作业,我会创建一个bash脚本,它会执行(没有任何超时)php脚本,只要它不会以exit(0)
(所有作业都成功执行)结束,或者不会返回"Done!"
或任何你喜欢的东西。
Exampe bash脚本:1,2
#!/bin/bash
# Note that false sets $? to 1
false
while [ $? -ne 0 ]; do
php /path/to/your/script.php >> log.log
done
如果你需要确保没有两个实例会同时运行,请谷歌其中一个(只是在我的脑海中):
.pid
文件- mysql
LOCK TABLE
PS:如果您将使用某些方法,请确保您的脚本在中间崩溃时能够工作
只需在脚本开始时一起禁用时间限制:
set_time_limit(0);
如果您的主机的TOS排除了使用无限脚本,他们几乎肯定会反对重置脚本。唯一的选择是并行发送电子邮件,或者转移到另一个主机。