【问题标题】:php preventing max execution time limit for mail [duplicate]php防止邮件的最大执行时间限制[重复]
【发布时间】:2010-12-28 01:07:58
【问题描述】:

我有一个脚本可以每小时发送 300-500 封电子邮件。这意味着该脚本将使用 cron 或其他功能每小时触发一次。

服务器的最大执行时间限制为 30 秒,并且不可配置。

我一直在考虑下面的伪代码是否应该工作:

$time=time();
$count=0;
while(condition){
    $count++;
    send(email);
    $now=time();
    if($now-$time>=29){break;} //1sec margin
}
echo "$count e-mails sent";

意见?

【问题讨论】:

  • 所以我假设你不能使用ini_set('max_execution_time', 300)?
  • 我不想开始无用的讨论。如果这些是你的参数,那就这样吧....但是每天发送 10k 封邮件加上被限制在这样一个限制性的 php 环境中,对我来说听起来有点不匹配;-)

标签: php


【解决方案1】:

如果您的脚本是使用 cron 启动的,则意味着您正在使用 PHP-CLI“PHP 命令行界面”。

正如PHP documentation 中提到的,您在使用 CLI 时没有时间限制。

所以您不必担心:max_execution_time 设置为 unlimited

【讨论】:

  • 没错!从 shell 运行脚本时不应超时。
【解决方案2】:

只是为了仔细检查您无法设置执行时间,这里有两个建议。


您只需在发送电子邮件之前致电set_time_limit()。根据PHP docs

调用时,set_time_limit() 从零重新启动超时计数器。换句话说,如果超时是默认的 30 秒,并且在脚本执行 25 秒后调用了诸如 set_time_limit(20) 之类的调用,则脚本将在超时之前总共运行 45 秒。

例如:

foreach ($emails as $email) {
    set_time_limit(30);
    send($email, ...);
}

另一个选项是通过 cron。由于您是从 cron 作业运行 PHP,因此您可以 specify your own php.ini。您可以按如下方式执行脚本:

php -c /custom/directory/my_php.ini my_script.php

my_php.ini 可以指定:

max_execution_time = 0     ; (unlimited)

【讨论】:

  • 在他的情况下,时间限制是不可配置的。
【解决方案3】:

将任务分解成更小的块。使用数据库来保持实际作业执行的“状态”。

这种方法的优点是可扩展:随着您的成长,您最终可能不得不发送更多电子邮件,不是吗?

【讨论】:

  • 好吧。问题是“它应该有多小?”。我的订阅列表有近 50.000 个条目。电子邮件/小时限制由我的主机设置。我猜是 php 每次执行是否能够触发至少 300 次。
  • @Paulo:好的,我更了解您所面临的情况。无论如何,您需要一种处理异常的策略:这就是在永久存储中保留上下文的时候。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-28
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多