PHP - 停止并捕获耗时过长的代码
Posted
技术标签:
【中文标题】PHP - 停止并捕获耗时过长的代码【英文标题】:PHP - Stop and catch code which takes too long 【发布时间】:2013-02-04 21:42:16 【问题描述】:我想将 php 的特定部分限制为 X 秒 - 如果需要更长时间,杀死当前正在执行的代码(只是部分,而不是整个脚本)并运行替代代码.
伪代码示例(此处的示例用例是一个不稳定的 API,有时速度很快,有时它是一个黑洞):
$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";
但是,这应该适用于任何东西。不仅仅是 API/HTTP 请求。例如。一个密集的数据库过程。
如果您阅读速度过快:set_time_limit
和 max_execution_time
不是答案,因为它们会影响整个脚本的时间限制 而不仅仅是一个部分(当然,除非我对它们的工作方式有误)。
【问题讨论】:
如果api依赖cURL,可以看一下timeout parameter。 假设max_execution_time
已经设置为∞
也许可以尝试(如果不使用 curl)将使用异步处理系统,如 gearman,根据 SO,它们可以在处理过程中中途停止:***.com/questions/2270323/…
【参考方案1】:
如果是 API 调用,我建议使用 cURL,您可以为此设置 API 调用的特定超时。
对于一般用途,您可以查看分叉进程,这将使您能够为每个进程计时并在它超过预期时间时终止它。
当然,如果这段代码可能由于高度重复的循环结构而需要很长的执行时间,您可以提供自己的计时器以在指定的时间间隔后跳出循环。
我可能没有直接回答您的问题,但我真正想表达的是,您可能必须根据代码块的实际作用使用不同的方法。
【讨论】:
以上是关于PHP - 停止并捕获耗时过长的代码的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C# 中按下停止按钮来停止耗时过长的 UI 线程 [关闭]