PHP-停止并捕获花费太长时间的代码

PHP-停止并捕获花费太长时间的代码,php,Php,我想将PHP的一个特定部分限制在X秒之内——如果需要更长的时间,请删除当前正在执行的代码(只是该部分,而不是整个脚本),然后运行另一个代码 伪代码示例(这里的示例用例是一个不稳定的API,有时速度很快,有时是一个黑洞): $completed=1; $seconds=60; 而($completed!=-1&&$completedgetStuff('user=“bob”'); $completed=-1; }捕获(){ $completed++; 睡眠(10); } } 如果($complete

我想将PHP的一个特定部分限制在X秒之内——如果需要更长的时间,请删除当前正在执行的代码(只是该部分,而不是整个脚本),然后运行另一个代码

伪代码示例(这里的示例用例是一个不稳定的API,有时速度很快,有时是一个黑洞):

$completed=1;
$seconds=60;
而($completed!=-1&&$completed<5){
限制(秒){
$api=newsomeapi('user','secret','key');
$data=$api->getStuff('user=“bob”');
$completed=-1;
}捕获(){
$completed++;
睡眠(10);
}
}
如果($completed==5)回显“错误:API黑洞已经存在5次。\n”;
否则{
//注意:数据处理超出时间限制
foreach($行数据){
echo$row['name'].:'.$row['message'.]。“\n”;
}
}
然而,这应该适用于任何情况。不仅仅是API/HTTP请求。例如,密集的数据库过程


如果你读得太快:
设置时间限制
最大执行时间
不是答案,因为它们会影响整个脚本的时间限制,而不仅仅是一个部分(当然,除非我对它们的工作方式有错误)。

对于API调用,我建议使用cURL,可以为其设置API调用的特定超时

对于一般用途,您可以查看分叉进程,这将使您能够对每个进程计时,并在超出预期时间时终止它

当然,如果由于高度重复的循环结构,代码部分的执行时间可能较长,那么您可以提供自己的计时器,在指定的时间间隔后中断循环


我可能没有直接回答您的问题,但实际上我想说的是,根据代码块的实际功能,您可能必须使用不同的方法。

如果api依赖于cURL,您可以查看一下。假设
max\u execution\u time
已设置为∞也许可以尝试(如果不使用curl)使用异步处理系统,如gearman,以便在处理过程中中途停止:
$completed = 1;
$seconds = 60;
while ($completed != -1 && $completed < 5) {
    limit ($seconds) {
        $api = new SomeAPI('user','secret','key');
        $data = $api->getStuff('user="bob"');
        $completed = -1;
    } catch () {
        $completed++;
        sleep(10);
    }
}
if ($completed === 5) echo "Error: API black-hole'd 5 times.\n";
else {
    //Notice: data processing is OUTSIDE of the time limit
    foreach ($data as $row) {
          echo $row['name'].': '.$row['message']."\n";
    }
}