【问题标题】:PHP: Coding long-running scripts when servers impose an execution time limitPHP:当服务器施加执行时间限制时编写长时间运行的脚本
【发布时间】:2010-05-14 03:12:25
【问题描述】:

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

我为 PHP 应用程序编写了一个导入脚本,该脚本在 mod_php 下运行良好,但在 FastCGI (mod_fcgid) 下失败,因为该脚本在一定秒数后被终止。在这种情况下,我还不知道有什么方法可以检测您的时间限制,并且还没有决定我将如何解决它。用重定向分小块做这件事似乎是一个难题,但是怎么做呢?

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

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

【问题讨论】:

    标签: php portability fastcgi execution-time


    【解决方案1】:

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

    【讨论】:

    • +1 用于使用 cron。不应使用网络脚本运行长时间运行的任务
    • 我不明白这怎么能推迟 php.ini 中声明的时间限制,你能更具体一点吗?谢谢
    • @Benoit 我指的是服务器(Apache、IIS 等)或服务器模块(FastCGI/fcgid)施加的时间限制。从命令行运行时,您不会有那些特定的限制,唯一的限制是 PHP 本身可以控制的限制。从命令行运行的缺点是它的可移植性不高——您必须为 Windows 服务器设置不同的设置,或者根据 PHP 可执行文件的路径等进行更改。不过,它是一种选择。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      通过重定向分小块进行操作似乎是一团糟,但如何做呢?

      这正是我在内置导出机制开始达到 max_execution_time 限制时处理完整论坛数据库备份 (phpBB) 的方式。

      我一次只做一张桌子,大桌子有 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 可以自行重建)之前,这个备份脚本需要半个多小时才能完成。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多