7

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

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

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

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

4

3 回答 3

4

使用不受 Web 服务器施加的脚本时间限制的PHP 命令行界面。如果您需要自动执行脚本,您可以使用 cron 来安排它。

于 2010-05-14T03:16:12.990 回答
-1

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

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

于 2010-05-14T12:32:32.507 回答
-1

用重定向小块做这件事似乎是一个难题,但是怎么做呢?

这正是我在内置导出机制开始达到 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 可以自行重建)之前,这个备份脚本需要半个多小时才能完成。

于 2010-05-14T13:06:34.570 回答