【问题标题】:Why doesnt set_time_limit work as expected? [duplicate]为什么 set_time_limit 没有按预期工作? [复制]
【发布时间】:2011-09-20 23:35:10
【问题描述】:

快速看一下下面的sn-p:

<?
set_time_limit(5);
sleep(30);
echo 'done';
?>

当我在我的盒子上执行此操作时,脚本需要整整 30 秒,并显示“完成”。

为什么?

它是否应该在 5 秒内终止并且不给脚本时间来显示“完成”?

这不在 CLI 模式下。 Nginx + PHP_FPM。

有什么想法吗?


我选择将“答案”放在这里,因为下面有很多好的和有效的答案。但是...这似乎是睡眠的特定问题。

<?
set_time_limit(5);
while(true==true){
}
sleep(30);
echo 'done';
?>

按预期工作。

【问题讨论】:

  • sleep() 时间是否计入执行时间?

标签: php timeout sleep


【解决方案1】:

引用the manual

set_time_limit() 函数和配置指令 max_execution_time 只影响脚本的执行时间 本身。在执行之外发生的活动上花费的任何时间 诸如使用system()的系统调用、流操作、 确定最大值时不包括数据库查询等 脚本运行的时间。在 Windows 上不是这样 其中测量的时间是真实的。

sleep 调用不会增加执行时间,因为它是一个 OS 进程并且什么都没有做。

【讨论】:

    【解决方案2】:

    根据set_time_limit() 文档:

    注意:

    set_time_limit() 函数和配置指令 max_execution_time 只影响脚本本身的执行时间。在确定脚本运行的最长时间时,不包括在脚本执行之外发生的活动所花费的任何时间,例如使用 system() 的系统调用、流操作、数据库查询等。在实测时间为真实的 Windows 上,情况并非如此。

    sleep() 的调用不计入执行时间(Windows 下除外)。这种行为在 set_time_limit() 页面上的 cmets 中有详细记录。

    【讨论】:

      【解决方案3】:

      来自 php.net:当被调用时,set_time_limit() 从零重新启动超时计数器。换句话说,如果超时时间是默认的 30 秒,并且在脚本执行 25 秒后调用了诸如 set_time_limit(20) 之类的调用,那么脚本将在超时之前总共运行 45 秒。

      您可以减去以匹配您想要的时间

      【讨论】:

        猜你喜欢
        • 2013-08-09
        • 1970-01-01
        • 2014-08-04
        • 2021-01-03
        • 2018-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多