你如何设置PHP的CLI组件的最大执行时间?

你如何设置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