1
cxbig 2017-07-13 14:11:00 +08:00
你这个死循环是经由 Apache 不断的访问某个 PHP 脚本?还是访问一次 PHP 不停的跑?
如果是前者,max_execution_time 没有意义。 |
2
cxbig 2017-07-13 14:12:58 +08:00
如果是后者,试着在该脚本输出一下 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-07-13 16:25:01 +08:00
你这段代码很短时间就跑完了把,你设置的 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-07-13 17:15:36 +08:00
满足 time()>$now 这个条件才会输出,也就是一秒输出一次了
|
10
linoder 2017-07-13 17:50:27 +08:00
Web 情况下:
ini_get 查看 max_execution_time 是否被重新设置 一般 web 用 ini_set('max_execution_time', s); Cli 情况下: 没有超时 只有溢出 或者 中断信号 才会退出 |
11
studentht 2017-07-13 18:30:24 +08:00
我能骂人不?
if( time()>$now ) 除了第一秒会卡住,后面时 time()总是大于$now 的,有什么问题! 这段代码执行时间就费时几秒钟,根本不会等到 PHP 执行超时!!! PS: $n=time(); 这句,$n 是干什么用的? |
13
cxbig 2017-07-14 06:38:13 +08:00
@studentht
和系统相关的操作,包括 sleep(),是不算在 max_execution_time 里的。这里有说明 http://php.net/manual/en/function.set-time-limit.php |
14
cxbig 2017-07-14 06:44:49 +08:00
@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-07-14 08:27:00 +08:00
这段代码有点逗。
|
16
raysonlu OP |
17
zhengwenk 2017-07-14 09:39:19 +08:00
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-07-14 13:41:19 +08:00
@raysonlu 操作系统,Apache 的版本都报一下,你 Apache 是在什么模式运行的,是用什么方式和 PHP 交互的(加载 PHP 模块的代码)
|
20
raysonlu OP @studentht apache2.4,普通的,使用 modules 加载 php,使用 event MPM,开启了 keepAlive
|
21
studentht 2017-07-14 14:52:26 +08:00
Apache 使用 event MPM 模式的话,那么 PHP 这边是使用的 FPM 吧, 在 php-fpm 配置里设置 request_terminate_timeout 看看
|
23
ihaveobj 2017-07-14 21:49:38 +08:00 via iPhone
手机上回复,没有经过测试。
你把 while 里的 echo 全注释,在循环结束输出下试试。 印象中 max_execution_time 是控制脚本的响应,你循环中输出的字符可能已经被刷出缓冲区了。 |
25
raysonlu OP |
26
raysonlu OP @ihaveobj
试了你说的,一样,不关输出缓冲吧,因为我测试代码中循环后面至少还有一个 echo "success"要执行 |
27
awanganddong 2022-04-28 14:36:38 +08:00
遇到相同的问题,标记下
|
28
awanganddong 2022-04-28 14:54:56 +08:00
配置指令 max_execution_time 只影响脚本本身执行的时间。任何发生在诸如使用 system()的系统调用,流操作,数据库操作等的脚本执行的最大时间不包括其中,当该脚本已运行。
``` 我在使用如下操作的时候,是可以报系统异常的。如果把循环内替换为 var_dump(),则一直死循环。在循环内添加 var_dump(),也是死循环。推测是如果牵扯到系统调用等操作,会把系统默认参数初始化。 $dummy = 2; for ($i = 0; $i < 10000000000; $i++) { $dummy *= 2; } ``` |