防止代码块中的php超时

防止代码块中的php超时,php,timeout,Php,Timeout,想知道如果一部分代码已经开始被处理,是否存在防止php超时的was 让我解释一下: 我有一个脚本执行的时间太长,甚至无法使用 ini_set('max_execution_time', 0); set_time_limit(0); 代码的构建允许它超时并重新启动,但我有两行代码需要一起执行才能实现 $email->save(); $this->_setDoneWebsiteId($user['id'], $websiteId); 在php中有没有一种方法可以告诉它,即使调用了超

想知道如果一部分代码已经开始被处理,是否存在防止php超时的was

让我解释一下:

我有一个脚本执行的时间太长,甚至无法使用

ini_set('max_execution_time', 0);
set_time_limit(0); 
代码的构建允许它超时并重新启动,但我有两行代码需要一起执行才能实现

$email->save();
$this->_setDoneWebsiteId($user['id'], $websiteId);
在php中有没有一种方法可以告诉它,即使调用了超时,它也必须完成这两个任务

在我写这篇文章的时候,我有了一个想法,我可以用120秒中的一个时间来启动一个计时器,如果在超时停止之前还有不到20秒的时间,我只是想知道我是否遗漏了什么


感谢您的投入。

您可以做的一件事是使用日期时间功能来监控您的平均执行时间。(假设有一个循环,每次执行都会有一种累积)

如果平均then时间比您剩余的时间长(您将根据最大执行时间计算已经花费了多少时间),您将触发重新启动,并让它从停止的位置重新开始


然而,如果您遇到超时,您可能希望寻找使代码更高效的方法。

不,您不能中止超时处理程序,但我要说的是,如果您不解析一些大的内容,20秒是相当长的时间。但是,您可以执行以下操作:

  • 获取执行开始的时间(
    $start=$\u服务器['REQUEST\u time']
    或仅在控制器的开始处获取
    $start=microtime(true);
  • 在运行
    $email->save()
    或暂停/跳过代码(如有必要)之前,执行时间小于100秒的资源。这就像
    if(microtime(true)-$start<100){$email->save()…}
    一样简单。然而,您希望在这方面有更多的抽象
  • (如有必要)在两个方法都运行后检查执行时间,如果超时则停止执行

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

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

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


感谢您的输入,因为我认为定时器解决方案是最好的方法

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

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
    }
} 
ini\u集('max\u execution\u time',180);
设置时间限制(180);
$startTime=日期('U')//给我当前的时间戳
while(true){
//收集电子邮件所需的所有数据
//我知道在剩下1分钟的时间里打破这个循环太过分了
//但我真的不想冒险
如果(日期('U')<($startTime+120)){
$email->save();
$this->_setDoneWebsiteId($user['id',$websiteId);
}否则{
返回错误
}
} 
我无法使用测量每个周期平均时间的想法,因为它变化太大

我本可以提高代码的效率,但它的周期数是基于框架中用户和网站的数量。它应该足够大,需要多次运行才能完成

我必须做一些研究来理解寄存器的功能,但我会研究它

再次感谢你

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
    }
}