【问题标题】:php using loop to restart time limit for script executionphp使用循环重新启动脚本执行的时间限制
【发布时间】:2012-07-23 02:03:27
【问题描述】:

我正在 php 中运行一个 foreach 循环,它的执行时间比我的最大执行时间 30 秒要长。循环向用户发送单独的电子邮件。

仅使用 set_time_limit(30) 重新启动循环中的计数器而不是每 30 秒运行一次 cron 作业并为记录创建队列是不道德的吗?

$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

【问题讨论】:

  • 不道德?不。反对你的主机服务条款?也许吧。
  • 你能运行 cronjob 吗?邮件队列?

标签: php performance loops timeout


【解决方案1】:

foreach 循环中运行set_time_limit 会同时带来并解决一些问题。

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

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

我会选择这个:

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

并且会使用你的脚本。

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

示例 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:如果您将使用其中的一些方法,请确保您的脚本在中间崩溃时能够正常工作

【讨论】:

  • 感谢您的回答!如果一封电子邮件发生错误,则循环继续到下一封电子邮件,我正在记录错误。我将研究您建议我没有经验的“bash 脚本”。
  • @Cyber​​Junkie 我添加了 bash 示例和一些相关来源
【解决方案2】:

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

【讨论】:

  • 我想我最终会使用频繁的 cron 作业。
【解决方案3】:

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

set_time_limit(0);

【讨论】:

  • 或者设置一个更合理的时间长度。
  • 我更喜欢他原来的解决方案,它解决了挂起邮件\服务器可能出现的任何问题。
猜你喜欢
  • 2020-09-28
  • 1970-01-01
  • 2017-04-20
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-06
  • 2012-08-25
相关资源
最近更新 更多