快速浏览以下代码段:
<?
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';
?>
按预期工作。
答案 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秒。
您可以减去以匹配您想要的时间