如果部分代码已经开始处理,想知道是否存在阻止php超时的问题。
让我解释一下:
我有一个执行的脚本,需要花费太长时间才能使用
ini_set('max_execution_time', 0);
set_time_limit(0);
构建代码是为了允许它超时并重新启动它所在的位置,但是我有2行代码需要一起执行才能实现
$email->save();
$this->_setDoneWebsiteId($user['id'], $websiteId);
有没有一种方法在php中告诉它即使超时被调用也必须完成它们的执行?
知道我正在写这个,我可以使用120秒的time_out并启动一个计时器,如果在超时之前还有不到20秒的时间停止,我只是想知道我是否缺少东西。
感谢您的投入。
答案 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,但我会调查一下。
再次谢谢你!