2012-07-24 64 views
2

我正在php中运行一个foreach循环,它比我的最大执行时间30秒执行花费的时间更长。该循环将单个电子邮件发送给用户。php使用循环来重新启动脚本执行的时间限制

而不是每隔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)违背托管服务条款,我认为,重新启动超时计数器重新启动脚本,以及将科雷

+2

不道德?不是,针对你的主机TOS?也许。 – 2012-07-24 17:32:22

+0

你能够运行cronjob吗?邮件队列? – ajreal 2012-07-24 17:43:03

回答

2

运行set_time_limitforeach循环同时带来并解决了一些问题。

我看到这个解决方案的最大优点是确保没有任何请求需要超过30秒的时间(并且当您有完整的提示时,我相信甚至需要剪切需要这么长时间的每个脚本)。

它带来的问题是没有必要执行所有的工作。也许你会在作业队列中遇到一些问题,并且都会失败。

我会去与这样的:

# crontab 
0,30 * * * * php /path/to/your/script.php 

,并会使用你的脚本。

如果您需要尽快执行作业,我会创建一个bash脚本,只要它不会以exit(0)(所有作业成功执行)结束,就会执行(不超时)php脚本,不会返回"Done!"或任何你喜欢的东西。

Exampe bash脚本:12

#!/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:如果你会使用一些方法,请确保你的脚本在中间崩溃时工作

+0

谢谢你的回答!如果一封电子邮件发生错误,则循环继续到下一封电子邮件,并记录错误。我会研究“bash脚本”,你建议我没有这方面的经验。 – CyberJunkie 2012-07-24 18:33:17

+0

@Cyber​​Junkie我添加了bash示例和一些相关的源代码 – Vyktor 2012-07-24 18:41:07

2

只要停用的时间限制一起在脚本的开始:

set_time_limit(0); 
+1

或设置为更合理的时间长度。 – 2012-07-24 17:34:50

+1

我更喜欢他的原始解决方案,它解决了挂起邮件\服务器的任何可能的问题。 – Vyktor 2012-07-24 18:14:06

0

如果您的主机的TOS排除使用无限制的脚本,他们几乎肯定会反对重置脚本。唯一的选择是并行发送电子邮件,或移动到不同的主机。

+0

我想我最终会使用频繁的cron作业。 – CyberJunkie 2012-07-24 18:34:45