3

我在 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

4

3 回答 3

4

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

我认为这个解决方案的最大优点是确保没有请求将花费超过 30 秒的时间(当你有一个完整的提示时,我相信甚至希望削减每个需要这么长时间的脚本)。

它带来的问题是,并非所有工作都必须执行。也许您会在作业队列中间遇到一些问题,这一切都会失败。

我会这样做:

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

并且会使用你的脚本。

如果您需要尽可能快地执行作业,我会创建一个 bash 脚本,只要它不会完成exit(0)(所有作业都成功执行)或不会返回"Done!"或其他什么,它将执行(没有任何超时)php 脚本你喜欢。

示例 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文件
  • mysqlLOCK TABLE

PS:如果您将使用某些方法,请确保您的脚本在中间崩溃时可以正常工作

于 2012-07-24T18:26:06.297 回答
2

只需在脚本开始时一起禁用时间限制:

set_time_limit(0);
于 2012-07-24T17:33:09.093 回答
0

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

于 2012-07-24T18:23:29.950 回答