代码之家  ›  专栏  ›  技术社区  ›  thomasrutter

php:在服务器施加执行时间限制时对长时间运行的脚本进行编码

  •  7
  • thomasrutter  · 技术社区  · 14 年前

    例如,fastcgi服务器对不能使用 set_time_limit() 在PHP中。我也相信我会这么做。

    我为一个PHP应用程序编写了一个导入脚本,该脚本在mod_php下运行良好,但在fastcgi(mod_fcgid)下失败,因为脚本在一定的秒数后被杀死。在这种情况下,我还不知道如何检测你的时间限制,也还没有决定如何避开它。用重定向把它分成小块看起来像是一个拼凑的过程,但是怎么做呢?

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

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

    3 回复  |  直到 14 年前
        1
  •  4
  •   Asaph    14 年前

    使用 PHP command line interface 它不受Web服务器规定的脚本时间限制的限制。如果需要自动执行脚本,可以使用cron调度脚本。

        2
  •  -1
  •   Kevin Schroeder    14 年前

    你真正在说的是工作排队。这是从前端请求异步运行PHP代码的实践。在PHP中有两种主要的方法。一种是使用一个名为gearman的程序,另一种是使用zend服务器作业队列,我个人对此比较熟悉。我有一篇关于你怎么做的博客,叫做 Do you Queue . 我发现我在那里的实现非常容易使用。

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

        3
  •  -1
  •   Ed Daniel    14 年前

    用重定向把它分成小块看起来像是一个拼凑的过程,但是怎么做呢?

    当内置的导出机制开始达到最大执行时间限制时,这正是我处理完整论坛数据库备份(phpbb)的方式。

    我一次只做一张桌子,对于5000行的大桌子。(结果发现,整个过程中的限制因素不是导出的执行时间,而是phpmyadmin在导入时可以处理的文件大小。)

    在导出每个块之后,我返回了一个头部带有meta-refresh标记的页面,将脚本重定向回其自身,其中包含下一个块的表号和查询字符串中的起始行。

    <?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可以自行重建)之前,完成这个备份脚本需要半个多小时。