防止代码块中的php超时

时间:2014-11-09 20:33:37

标签: php timeout

如果部分代码已经开始处理,想知道是否存在阻止php超时的问题。

让我解释一下:

我有一个执行的脚本,需要花费太长时间才能使用

ini_set('max_execution_time', 0);
set_time_limit(0); 

构建代码是为了允许它超时并重新启动它所在的位置,但是我有2行代码需要一起执行才能实现

$email->save();
$this->_setDoneWebsiteId($user['id'], $websiteId);

有没有一种方法在php中告诉它即使超时被调用也必须完成它们的执行?

知道我正在写这个,我可以使用120秒的time_out并启动一个计时器,如果在超时之前还有不到20秒的时间停止,我只是想知道我是否缺少东西。

感谢您的投入。

4 个答案:

答案 0 :(得分:1)

如果您的代码不同步且某项任务需要超过100秒 - 您将无法检查执行时间。

我只看到一个真正的HACK(小心,在控制台中使用php -f测试它以便能够杀死进程):

<?php
// Any preparations here
register_shutdown_function(function(){
    if (error_get_last()) { // There was timeout exceeded error
        // Call the rest of your system
        // But note: you have no stack, no context, no valid previous frame - nothing!
    }
});

答案 1 :(得分:0)

您可以做的一件事是使用DATE时间功能来监控您的平均执行时间。 (假设你有一个循环,每次执行都会有所建立。)

如果平均然后时间比你离开的时间长(你将计算已经花费了多少时间来对抗你的最大执行时间),你会触发重启并让它从哪里拿起它离开了。

如果您遇到超时,您可能希望了解如何提高代码效率。

答案 2 :(得分:0)

不,你不能中止超时处理程序,但我会说,如果你没有解析一些巨大的东西,20秒是相当大的时间。但是,您可以执行以下操作:

  • 在控制器的开头获取执行开始时间($start = $_SERVER['REQUEST_TIME']$start = microtime(true);)。
  • 在运行$email->save()之前执行时间小于100秒的资产,或者在必要时暂停/跳过代码。这和if (microtime(true) - $start < 100) { $email->save()... }一样简单。但是,你希望对此有更多的抽象。
  • (如有必要)检查两个方法运行后的执行时间,如果超时则停止执行。

这将要求time_limit设置为大值,甚至关闭和繁琐的工作以防止执行太长时间。在大多数情况下,超时是你的朋友,只是告诉你工作花了太多时间,你应该重新思考你的架构和内部过程;如果你超过120秒,你可能想把这项工作放在一个守护进程上。

答案 3 :(得分:0)

感谢您的意见,因为我认为计时器解决方案是最佳方式。

我最终做的是以下内容,这不是实际的代码,因为它太长了,无法做出好的答案,只是一般的想法。

ini_set('max_execution_time', 180);
set_time_limit(180); 

$startTime = date('U'); //give me the current timestamps

while(true){
//gather all the data i need for the email

    //I know its overkill to break the loop with 1 min remaining 
    //but i realy dont want to take chances
    if(date('U') < ($startTime+120)){
        $email->save();
        $this->_setDoneWebsiteId($user['id'], $websiteId);
    }else{
        return false
    }
} 

我无法使用测量每个周期的平均时间的想法,因为它变化太大。

我本可以提高代码效率,但循环次数取决于框架中的用户和网站数量。它应该变得足够大,无论如何都需要多次运行才能完成。

我必须做一些研究来了解register_shutdown_function,但我会调查一下。

再次谢谢你!