PHP将脚本分散到多个部分以避免服务器超时

时间:2012-01-26 06:47:43

标签: php apache

我有一个执行时间非常长的脚本,因此当我运行它时,它会在我的网络服务器上达到最大执行时间并最终超时。

为了说明这个想象,我有一个for循环,可以进行一些非常密集的操作一百万次。我怎么能在几个部分中传播这个循环执行,这样我才能达到我的Web服务器的最大执行时间?

非常感谢,

6 个答案:

答案 0 :(得分:2)

如果你的应用程序将循环已知次数(即你确定它将在一段时间内完成),你可以增加循环内的时间限制:

foreach ($data as $row) {
    set_time_limit(10);
    // do your stuff here
}

此解决方案可以防止您进行一次失控迭代,但只要您需要,您的整个脚本就可以不受干扰地运行。

答案 1 :(得分:1)

最佳解决方案是使用http://php.net/manual/en/function.set-time-limit.php更改超时。否则,您可以使用301重定向在超时时发送到更新的URL。

$threshold = 10000;
$t = microtime();
$i = isset( $_GET['i'] ) ? $_GET['i'] : 0;

for( $i; $i < 10000000; $i++ )
{
    if( microtime - $t > $threshold )
    {
        header('Location: http://www.example.com/?i='.$i);
        exit;
    }

    // Your code
}

浏览器只会在停止之前尊重一些重定向,您最好使用javascript强制重新加载页面。

答案 2 :(得分:1)

有一天我使用了一种技术,我将工作从一个文件分成三个部分。它只是一个由120,000个元素组成的阵列,操作密集。我创建了一个拆分器脚本,它将数组存储在每个大小为40.000的数据库中。然后我创建了一个HTML文件,重定向到第一个PHP文件,以计算前40.000个元素。在计算了前40,000个元素之后,我再次将HTML转发到下一个PHP文件,依此类推。

不是很优雅,但它有效: - )

答案 3 :(得分:0)

如果您在托管服务器上拥有正确的权限,则可以使用php解释器执行php脚本并让它在后台运行。

请参阅Asynchronous shell exec in PHP

答案 4 :(得分:0)

如果您正在运行需要在未知时间执行的脚本,则可以使用:

set_time_limit(0);

答案 5 :(得分:0)

如果可能,您可以创建脚本,以便它处理一部分想要的操作。一旦完成说10%,你通过AJAX再次调用脚本来执行下一个10%。但在某些情况下,这不是一个理想的解决方案,它实际上取决于你在做什么。

我使用此方法创建基于Web的爬网程序,该爬网程序仅在我的计算机上运行。如果它必须立即进行操作,它也会超时。因此它分为200个“任务”,每个任务在前一个完成后通过Ajax调用。工作得很好,自开始运行已经超过一年了(爬行?)