2010-05-14 108 views
7

例如,FastCGI服务器对PHP脚本强制执行时间限制,PHP脚本无法使用set_time_limit()在PHP中进行更改。我相信IIS也这样做。PHP:在服务器施加执行时间限制时对长时间运行的脚本进行编码

我为一个PHP应用程序编写了一个导入脚本,该脚本在mod_php下运行良好,但在FastCGI(mod_fcgid)下失败,因为该脚本在数秒后终止。我还不知道在这种情况下检测你的时间限制的方法,还没有决定我怎么去解决它。以小块进行重定向看起来像是一团糟,但是怎么样?

在编写长时间运行的任务(如导入或导出任务)时,您会使用哪些技术,其中个别PHP脚本可能会在某个秒数后由服务器终止?

请假设您正在创建一个可移植的脚本,因此您不一定知道PHP是否最终将在mod_php,FastCGI或IIS下运行,或者是否在服务器级别执行最大执行时间。这可能也会排除shell脚本等。

回答

4

使用PHP command line interface,它不受脚本Web服务器施加的时间限制。如果你需要自动执行你的脚本,你可以使用cron来安排它。

+4

使用cron的+1。长时间运行的任务不应该使用web脚本运行 – 2010-05-14 03:24:40

+0

我不明白如何推回php.ini中声明的时间限制,你可以更具体吗?谢谢 – Benoit 2010-05-14 07:00:22

+0

@Benoit我指的是服务器(Apache,IIS等)或服务器模块(FastCGI/fcgid)施加的时间限制。从命令行运行时,您不会有这些特定的限制,并且唯一的限制将是PHP本身控制的限制。从命令行运行的缺点是它不便于移植 - 您必须为Windows服务器设置不同的设置,或者根据PHP可执行文件的路径进行更改等。但仍然是一种选择。 – thomasrutter 2010-05-14 07:03:49

-1

你真正在谈论的是工作排队。这是从前端请求异步运行PHP代码的做法。在PHP中有两种主要的方法。一个是使用一个名为Gearman的程序,另一个是使用我个人更熟悉的Zend Server Job Queue。我有一篇关于如何做到这一点的博客帖子,名为Do you Queue。我发现我在那里的实现非常容易使用。

您可能还想尝试的是在执行逻辑之前将max_execution_time设置为0。

-1

这样做的小块与重定向似乎是一个kludge,但如何?

这就是我究竟是如何处理的全论坛的数据库备份(phpBB的)时,内置的导出机制开始打了极限max_execution_time仅仅。

我一次只做了一个表格,而对于5000行的大块表格,我做了一次。 (事实证明,整个过程中的限制因素并不是导出时的执行时间,而是实际上phpmyadmin可以在导入时处理的文件大小。)

在每个导出块后,我都返回了一页在标题中使用元刷新标记,使用下一个块的表号和查询字符串中的开始行重定向脚本。

<?php if(!$all_done){ 
    $new_url=$_SERVER['PHP_SELF'].'?tablecount='.$count; 
    if(!$tabledone && ""!=$start_row && null!=$start_row){ 
     $new_url.="&startrow=".$start_row; 
    } else { 
     $new_url.="&startrow=0"; 
    } 
    echo('<meta http-equiv="refresh" content="0.5;url='.$new_url.'" />'); 
} ?> 

这些计数器让我可以遍历我用SHOW TABLES检索的表名数组。

在我有机会从导出中剔除巨大的单词匹配表(phpBB可以自行重建)之前,这个备份脚本需要半个多小时才能完成。