如何执行大型PHP脚本?

时间:2010-05-15 15:50:41

标签: php timeout execution

基本上我可能想要执行一个可能需要1个小时的脚本。

我真正想要做的是使用第三方API向我的用户发送短信。所以它基本上就像我为我的脚本提供一系列电话号码并触发发送短信的方法。

然而,假设发送1条短信需要5秒钟,我想发送大约1至2小时的1000条短信。我无法使用set_time_limit()因为我在共享主机上。

执行此操作的一种方法是在会话中存储号码并执行每个SMS并使用javascript刷新该页面直到结束。这样我需要保持浏览器打开,如果我的Internet连接断开连接,执行将停止。

那么,有没有更好的方法呢?

希望我能够清楚地解释我想要什么?我想执行一个大型脚本,可能需要几个小时才能执行而不会超时。

7 个答案:

答案 0 :(得分:21)

从命令行或shell脚本,cron作业等执行的PHP脚本没有超时。

对于CLI调用的脚本,即使使用set_time_limit()函数动态设置PHP脚本的超时,它也无效。

答案 1 :(得分:5)

从命令行运行的PHP脚本不受max_execution_time选项的影响 所以你根本不必担心。

答案 2 :(得分:5)

如果您的主机允许您,cron作业是最佳解决方案。一个cron作业基本上是一个普通的PHP脚本,它由Web服务器以特定的时间间隔自动运行。根据您的需要,我会创建一个每5分钟运行一次的脚本,并以100个批量处理您的数字(显然,您需要调整时间间隔和批量大小以适应)。这将使您的服务器负载降低,并防止您与托管服务提供商遇到麻烦,以便占用资源。

为了跟踪脚本应该处理哪个批处理,我会设置一个track_batch表。这些专栏应该可以很好地说明如何解决问题:

id,date_run,start_record,end_record,final_run

基本上:

  • 检查最后一次的日期 批量运行。如果不是当前日期 (或您选择的任何其他标识符 用于)当前批次,然后 继续。
  • 如果当前日期的最后一批 运行,请检查 final_run列看是否 你已经完成了处理 所有的数字。
  • 如果您仍有要处理的号码,请使用开头和结尾 记录与MySQL的结合 LIMIT构建你的db查询 脚本将用于获取下一个 批量。
  • 处理您的号码。
  • 将此批次中的所有信息存储在track_batch表中。
  • 如果查询返回的数字量小于最大值 批量大小,你已经到了最后 并可以将final_run列设置为 1。

一旦你有了脚本,你就需要自己设置cron作业。共享主机可能有自己的自定义界面来执行此操作,因此一旦您的脚本正常工作,它们可能是最好的人。

答案 3 :(得分:3)

这不是使用set_time_limit(0)的最佳选择,因为这意味着即使您有错误并且您的脚本进入无限循环,它也会无限期地运行。

相反,如果您估计每条短信需要5秒钟,请使用此方法:

while( $there_are_more_sms_to_be_sent ){
  set_time_limit(30); // enough spare time, just in case.

  // Do your sending, blah blah
}

这样,时间限制将按顺序更新为30秒。当然,您可能会遇到单个while的无限循环问题,但如果您在while内部有其他调用,则该限制将阻止这些调用。< / p>

答案 4 :(得分:0)

可以不能使用set_time_limit()

如果可以..使用它:

<?php
// Runs forever and ever...
set_time_limit(-1);
?>

答案 5 :(得分:0)

使用JavaScript的另一种方法是将Refresh元标记添加到您的网页:

<meta http-equiv="Refresh" content="2; url=http://yoururl/script.php&step=x" ?>

content="2; url=..中的两个告诉浏览器在页面加载后加载网址2秒。

答案 6 :(得分:0)

在你可以运行CRON JOBS的情况下

我通常有队列,经理和工人。除非您可以在此模型可以帮助您时调用短信api,并且您不必担心超时,因为每个工作人员都会自行管理。

我有类似的东西:

<?php
// PSEUDO CODE
// grab pending from queue

// <for> {
// update to running
exec("/usr/bin/php /path/to/send.php {$id} > /dev/null &");
// }

和send.php将发送每个短信。现在我以300 /分钟的速度运行,因为你可以在cron作业上设置的最大频率