为什么set_time_limit没有按预期工作?

时间:2011-09-20 23:35:11

标签: php timeout sleep

快速浏览以下代码段:

<?
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';
?>

按预期工作。

3 个答案:

答案 0 :(得分:1)

引用the manual

  

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

sleep调用不会增加执行时间,因为它是一个操作系统进程,并且没有任何操作。

答案 1 :(得分:1)

根据set_time_limit()文档:

  

注意:

     

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

sleep()的调用不算作执行时间(Windows下除外)。 set_time_limit()页面上的评论中详细记录了此行为。

答案 2 :(得分:0)

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

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