set_time_limit()和ini_set('max_execution_time',…)之间的区别

这两行代码有没有实际的区别?

ini_set('max_execution_time', 20*60); set_time_limit(20*60); 

纵观当前的资料来源 :

 /* {{{ proto bool set_time_limit(int seconds) Sets the maximum time a script can run */ PHP_FUNCTION(set_time_limit) { zend_long new_timeout; char *new_timeout_str; int new_timeout_strlen; zend_string *key; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &new_timeout) == FAILURE) { return; } new_timeout_strlen = zend_spprintf(&new_timeout_str, 0, ZEND_LONG_FMT, new_timeout); key = zend_string_init("max_execution_time", sizeof("max_execution_time")-1, 0); if (zend_alter_ini_entry_chars_ex(key, new_timeout_str, new_timeout_strlen, PHP_INI_USER, PHP_INI_STAGE_RUNTIME, 0 TSRMLS_CC) == SUCCESS) { RETVAL_TRUE; } else { RETVAL_FALSE; } zend_string_release(key); efree(new_timeout_str); } /* }}} */ 

set_time_limit()实际上只是ini_set()调用的便利包装。 它似乎甚至没有执行广告定时器重置。 (但是我想“定时器”实际上不是一个单独的实体,但是ini值本身就是这样使用的。)

需要考虑的一个细微差别就是它们在失败时的行为方式:

  • set_time_limit()不返回任何东西,所以你不能用它来检测它是否成功。 另外,它会发出警告:

    警告:set_time_limit():不能在安全模式下设置时间限制

  • ini_set()在失败时返回FALSE ,不会触发警告。

在实践中,这应该不是什么大问题,因为安全模式据说是唯一可能导致失败的情况,而且这个function已经被弃用了。

除此之外,该函数只是属性更改的一个包装。

没有没有。

 echo ini_get('max_execution_time'); // 30 set_time_limit(100); echo ini_get('max_execution_time'); // 100 

关于定时器复位,在两种情况下均复位:

 ini_set('max_execution_time', 10); for ($i=0; $i<50000000; $i++) { } ini_set('max_execution_time', 10); // timer is reset, just as it would be with set_time_limit for ($i=0; $i<50000000; $i++) { } echo 'done'; 

根据php手册,set_time_limit()将在调用时重置执行计时器。 我不相信ini_set()有相同的副作用,这将是两者之间的差异。

有关更多信息,请参阅http://php.net/manual/en/function.set-time-limit.php

更新:因为检查了PHP源代码的各个部分(包括马里奥的答案引用的),这是我的结论是ini_set()和set_time_limit()是完全等价的。

ini_set()确实重置了定时器(尽pipe我仍然对这两个函数是如何执行重置的方式感到不知所措,当定时器结束时,我将不得不查找杀死脚本的函数)。

两种模式“set_time_limit(5)”和“ini_set('max_execution_time','5')”复位时间,一个实用而清晰的例子:

 //----------------------------------------------------------- //test "max_execution_time": ini_set('max_execution_time', 5); for ($i=0; $i<3; $i++) { sleep(1); } ini_set('max_execution_time', 5); for ($i=0; $i<3; $i++) { sleep(1); } echo '<br/>'; echo 'done with max_execution_time'; //----------------------------------------------------------- //test "set_time_limit": set_time_limit(5); for ($i=0; $i<3; $i++) { sleep(1); } set_time_limit(5); for ($i=0; $i<3; $i++) { sleep(1); } echo '<br/>'; echo 'done with set_time_limit'; 

所有“for”成功完成,这表示在所有情况下都重置了时间,问候

该代码只适用于Windows。 睡眠时间在PHP的Linux不消耗执行时间,例如在Linux中:

 <?php set_time_limit(2); for($i=0; $i<10; $i++) { echo ("$i \n"); sleep(1); } 

`会显示

1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

但Windows上使用默认configuration的相同代码将显示

1 | 2