php使用循环重新启动脚本执行的时间限制


php using loop to restart time limit for script execution

我在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排除了使用无限脚本,他们几乎肯定会反对重置脚本。唯一的选择是并行发送电子邮件,或者转移到另一个主机。