你如何设置PHP的CLI组件的最大执行时间? 我有一个进入无限循环的CLI脚本,我不知道如何在不重新启动的情况下杀死它。 我用quicksilver启动它,所以我不能在命令行上按Ctrl + C。 我尝试运行ps -A
(显示所有进程),但是php没有显示在列表中,所以也许已经超时了 – 但是如何手动设置时间限制?
我试图find关于应该在哪里设置max_execution_time
设置的信息,我习惯将此设置为使用apache运行的PHP版本,但我不知道应该将其设置为位于/usr/bin
的PHP版本/usr/bin
。
我确实看到了下面的引用,看起来是准确的(见下面的截图),但是执行时间不受限制似乎不是一个好主意。
请记住,对于CLI SAPI,max_execution_time被硬编码为0.所以它似乎被ini_set或set_time_limit更改,但实际上它不是。 我发现这个奇怪的决定的唯一参考是深入bugtracker( http://bugs.php.net/37306 )和php.ini(“max_execution_time”指令的注释)。 (通过http://php.net/manual/en/function.set-time-limit.php )
ini_set('max_execution_time')
没有效果。 我也试过同样的事情,并用set_time_limit(7)
得到相同的结果。
所以似乎有三种方法来实现这一点:
在脚本中:
参数或者set_time_limit(10); // 这条路 ini_set('max_execution_time',10); //或者这样
或者在调用脚本时:
php -d max_execution_time = 5 script.php
要回答我关于php.ini文件将从何处加载的问题,如果存在的话,那将来自/etc/php.ini
。 该文件还需要运行php脚本的用户可读,所以如果它是由root创build的,并且用户不能“读取”它,这意味着php可能无法“读取”它。
但是,似乎在/etc/php.ini
设置的任何max_execution_time实际上都不会影响CLI脚本 – 即使正确加载了文件(使用phpinfo()
查找) – 所以您必须使用其他方法之一上文提到的。
关于使用睡眠循环来testing这一点,我了解到,它不会工作。
set_time_limit()函数和configuration指令max_execution_time只影响脚本本身的执行时间。 在确定脚本运行的最长时间时,不包括使用system(),sleep()函数,数据库查询等在脚本执行之外发生的任何活动,如系统调用
检查出一个非常类似的问题上堆栈溢出问: https : //stackoverflow.com/questions/5874950/set-max-execution-time-in-php-cli
在你的PHP代码的顶部,
ini_set('max_execution_time',300);
要么
set_time_limit(300);
你确定它会进入一个循环? 如果执行的线程已经通过PHP之外的扩展(或其他地方),那么这将不起作用。
更好的解决scheme是将脚本包装在看门狗中
在testing脚本中,您使用sleep(5)
来testing长时间运行的执行时间,但这不是一个有效的testing。
最大执行时间的文档说这个:
最大执行时间不受系统调用,stream操作等的影响
和set_time_limit()的文档说:
在确定脚本运行的最长时间时,不包括使用system()系统调用,stream操作,数据库查询等脚本执行之外发生的任何活动时间。 在测量时间是真实的Windows上,这是不正确的。
如果你避免了睡眠系统调用, set_time_limit(5);
应该在CLI脚本中正常工作。 这是一个testing脚本,应该在5秒后退出:
<?php set_time_limit(5); $start = time(); $last = 0; for ($i=0;$i>=0;$i++) { if ($i%10000==0) { $took = time()-$start; if ($took!=$last) { echo "taken {$took} s so far...\n"; $last=$took; } } }
php timeout_test.php taken 1 s so far... taken 2 s so far... taken 3 s so far... taken 4 s so far... taken 5 s so far... PHP Fatal error: Maximum execution time of 5 seconds exceeded in /home/tom/MailChap/timeout_test.php on line 8 PHP Stack trace: PHP 1. {main}() /home/tom/MailChap/timeout_test.php:0