
1 cxbig 2017 年 7 月 13 日 你这个死循环是经由 Apache 不断的访问某个 PHP 脚本?还是访问一次 PHP 不停的跑? 如果是前者,max_execution_time 没有意义。 |
2 cxbig 2017 年 7 月 13 日 如果是后者,试着在该脚本输出一下 phpinfo 或者 max_execution_time 看看实际的值。 |
3 raysonlu OP @cxbig 后者,实际值是 120,但我做一个 echo 时间测试,发现无效。源码如下: $now=time(); $secOnd= 0; while($second<150){ if(time()>$now){ $n=time(); echo ++$second."second"; echo "<br>"; } } |
4 studentht 2017 年 7 月 13 日 你这段代码很短时间就跑完了把,你设置的 max_execution_time 值为多少? |
6 raysonlu OP 经过一些测试,更新一下问题 分别用 浏览器访问形式 与 服务器命令形式 运行 php 脚本: 1、max_execution_time 完全无效,上面那段测试代码我设置$second<200,都给我完整输出所有结果不报错; 2、set_time_limit 在命令形式下生效,附上一句 set_time_limit(10); 用命令执行以下,10 秒后就报错了,但浏览器访问仍然等待 10 秒以上并完整输出结果; 疑惑仍然持续。。。。 |
8 raysonlu OP @studentht 但在浏览器与命令形式上执行,的确是用了这么多时间,特别是命令模式,循环的 echo 是一秒一个现实出来的(注意我的$second 表示的意思应该是次数而不是实际时间的秒) |
9 jarhom 2017 年 7 月 13 日 满足 time()>$now 这个条件才会输出,也就是一秒输出一次了 |
10 linoder 2017 年 7 月 13 日 Web 情况下: ini_get 查看 max_execution_time 是否被重新设置 一般 web 用 ini_set('max_execution_time', s); Cli 情况下: 没有超时 只有溢出 或者 中断信号 才会退出 |
11 studentht 2017 年 7 月 13 日 我能骂人不? if( time()>$now ) 除了第一秒会卡住,后面时 time()总是大于$now 的,有什么问题! 这段代码执行时间就费时几秒钟,根本不会等到 PHP 执行超时!!! PS: $n=time(); 这句,$n 是干什么用的? |
13 cxbig 2017 年 7 月 14 日 @studentht 和系统相关的操作,包括 sleep(),是不算在 max_execution_time 里的。这里有说明 http://php.net/manual/en/function.set-time-limit.php |
14 cxbig 2017 年 7 月 14 日 @raysonlu 你的代码逻辑上没有问题 我在 Mac 下试的结果,配置用的 5 秒: 1second ... 5second Fatal error: Maximum execution time of 5 seconds exceeded ... 正常获得错误信息 要不你在脚本里输出 max_execution_time 再看看? var_dump(ini_get('max_execution_time')); |
15 torbrowserbridge 2017 年 7 月 14 日 这段代码有点逗。 |
16 raysonlu OP |
17 zhengwenk 2017 年 7 月 14 日 Your web server can have other timeout configurations that may also interrupt PHP execution. Apache has a Timeout directive and IIS has a CGI timeout function. Both default to 300 seconds. See your web server documentation for specific details. 是因为这个么? |
19 studentht 2017 年 7 月 14 日 @raysonlu 操作系统,Apache 的版本都报一下,你 Apache 是在什么模式运行的,是用什么方式和 PHP 交互的(加载 PHP 模块的代码) |
20 raysonlu OP @studentht apache2.4,普通的,使用 modules 加载 php,使用 event MPM,开启了 keepAlive |
21 studentht 2017 年 7 月 14 日 Apache 使用 event MPM 模式的话,那么 PHP 这边是使用的 FPM 吧, 在 php-fpm 配置里设置 request_terminate_timeout 看看 |
23 ihaveobj 2017 年 7 月 14 日 via iPhone 手机上回复,没有经过测试。 你把 while 里的 echo 全注释,在循环结束输出下试试。 印象中 max_execution_time 是控制脚本的响应,你循环中输出的字符可能已经被刷出缓冲区了。 |
25 raysonlu OP |
27 awanganddong 2022 年 4 月 28 日 遇到相同的问题,标记下 |
28 awanganddong 2022 年 4 月 28 日 配置指令 max_execution_time 只影响脚本本身执行的时间。任何发生在诸如使用 system()的系统调用,流操作,数据库操作等的脚本执行的最大时间不包括其中,当该脚本已运行。 ``` 我在使用如下操作的时候,是可以报系统异常的。如果把循环内替换为 var_dump(),则一直死循环。在循环内添加 var_dump(),也是死循环。推测是如果牵扯到系统调用等操作,会把系统默认参数初始化。 $dummy = 2; for ($i = 0; $i < 10000000000; $i++) { $dummy *= 2; } ``` |