PHP 的脚本执行时间无效了是什么原因? php5.6

2017-07-13 11:17:07 +08:00
 raysonlu
php 脚本执行没有了时间限制

php.ini 里面已设置了 max_execution_time,也尝试过在 ini_set 或使用 set_limit_time,但就是无效,一直不停地执行( apache+php,用浏览器访问,脚本用死循环不报错,循环 echo 时间多少秒都 echo,没有用 sleep )

网上搜到的都说是因为开启了安全模式,但我用 php5.6,应该是没有了安全模式了吧?

究竟是什么原因?很疑惑,求指点!谢谢!
5189 次点击
所在节点    PHP
28 条回复
cxbig
2017-07-13 14:11:00 +08:00
你这个死循环是经由 Apache 不断的访问某个 PHP 脚本?还是访问一次 PHP 不停的跑?
如果是前者,max_execution_time 没有意义。
cxbig
2017-07-13 14:12:58 +08:00
如果是后者,试着在该脚本输出一下 phpinfo 或者 max_execution_time 看看实际的值。
raysonlu
2017-07-13 15:21:51 +08:00
@cxbig 后者,实际值是 120,但我做一个 echo 时间测试,发现无效。源码如下:
$now=time();
$second = 0;
while($second<150){
if(time()>$now){
$n=time();
echo ++$second."second";
echo "<br>";
}
}
studentht
2017-07-13 16:25:01 +08:00
你这段代码很短时间就跑完了把,你设置的 max_execution_time 值为多少?
raysonlu
2017-07-13 16:33:10 +08:00
@studentht max_execution_time 在 php.ini 里面设置是 120
raysonlu
2017-07-13 16:37:38 +08:00
经过一些测试,更新一下问题

分别用 浏览器访问形式 与 服务器命令形式 运行 php 脚本:

1、max_execution_time 完全无效,上面那段测试代码我设置$second<200,都给我完整输出所有结果不报错;
2、set_time_limit 在命令形式下生效,附上一句 set_time_limit(10); 用命令执行以下,10 秒后就报错了,但浏览器访问仍然等待 10 秒以上并完整输出结果;

疑惑仍然持续。。。。
studentht
2017-07-13 16:44:38 +08:00
@raysonlu 你代码又没有 sleep,$second<200 执行起来几秒就够,又不是用 200s
raysonlu
2017-07-13 16:47:58 +08:00
@studentht 但在浏览器与命令形式上执行,的确是用了这么多时间,特别是命令模式,循环的 echo 是一秒一个现实出来的(注意我的$second 表示的意思应该是次数而不是实际时间的秒)
jarhom
2017-07-13 17:15:36 +08:00
满足 time()>$now 这个条件才会输出,也就是一秒输出一次了
linoder
2017-07-13 17:50:27 +08:00
Web 情况下:

ini_get 查看 max_execution_time 是否被重新设置
一般 web 用
ini_set('max_execution_time', s);

Cli 情况下:
没有超时
只有溢出 或者 中断信号 才会退出
studentht
2017-07-13 18:30:24 +08:00
我能骂人不?
if( time()>$now ) 除了第一秒会卡住,后面时 time()总是大于$now 的,有什么问题!
这段代码执行时间就费时几秒钟,根本不会等到 PHP 执行超时!!!

PS:
$n=time();
这句,$n 是干什么用的?
raysonlu
2017-07-13 23:00:01 +08:00
@studentht $n 其实是$now,贴上来的时候少改了这里,抱歉了
cxbig
2017-07-14 06:38:13 +08:00
@studentht
和系统相关的操作,包括 sleep(),是不算在 max_execution_time 里的。这里有说明
http://php.net/manual/en/function.set-time-limit.php
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'));
torbrowserbridge
2017-07-14 08:27:00 +08:00
这段代码有点逗。
raysonlu
2017-07-14 09:04:11 +08:00
@linoder
@cxbig
var_dump(ini_get('max_execution_time'));结果是
string(3) "120"
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.

是因为这个么?
raysonlu
2017-07-14 10:29:31 +08:00
@zhengwenk 用 apahce 的,timeout 设置了 30
studentht
2017-07-14 13:41:19 +08:00
@raysonlu 操作系统,Apache 的版本都报一下,你 Apache 是在什么模式运行的,是用什么方式和 PHP 交互的(加载 PHP 模块的代码)
raysonlu
2017-07-14 14:20:29 +08:00
@studentht apache2.4,普通的,使用 modules 加载 php,使用 event MPM,开启了 keepAlive

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/375001

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX