Difference between set_time_limit() and ini_set('max_execution_time', ...)
PhpPhp Problem Overview
Is there any actual difference between these two lines of code?
ini_set('max_execution_time', 20*60);
set_time_limit(20*60);
Php Solutions
Solution 1 - Php
Looking at the current source:
/* {{{ 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()
is indeed just a convenience wrapper around the according ini_set()
call. It doesn't even seem to perform the advertised timer reset. (But I would guess the "timer" actually isn't a separate entity, but the ini value itself is used as such.)
Solution 2 - Php
A tiny difference to take into account is the way they behave on failure:
-
set_time_limit()
does not return anything so you can't use it to detect whether it succeeded. Additionally, it'll throw a warning:> Warning: set_time_limit(): Cannot set time limit in safe mode
-
ini_set()
returnsFALSE
on failure and does not trigger warnings.
In practice, it should not be a great deal since safe mode is allegedly the only situation that can cause a failure and the feature is already deprecated.
Other than that, the function is just a wrapper for the property change.
Solution 3 - Php
No there isn't.
echo ini_get('max_execution_time'); // 30
set_time_limit(100);
echo ini_get('max_execution_time'); // 100
Regarding timer reset, it is reset in both cases:
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';
Solution 4 - Php
According to the php manual, set_time_limit() will reset the execution timer when called. I don't believe ini_set() has the same side-effect, which would be the difference between the two.
See http://php.net/manual/en/function.set-time-limit.php for more information.
Update: since examining various portions of the php source code (including that referenced by mario's answer), it is my conclusion that ini_set() and set_time_limit() are precisely equivalent.
ini_set() does indeed reset the timer (though I'm still at a loss as to how either function performs the reset, I would have to look up the function that kills the script when the timer ends to figure that one out).
Solution 5 - Php
Both modes "set_time_limit(5)" and "ini_set('max_execution_time', '5')" reset time, a practical and clear example:
//-----------------------------------------------------------
//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';
All "for" complete successfully, this indicates that the time was reset in all cases, Greetings
That code only is true on windows. Sleep time in php linux don't consume execution time for example in linux:
<?php
set_time_limit(2);
for($i=0; $i<10; $i++)
{
echo ("$i \n");
sleep(1);
}
` will show
> 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
but the same code on Windows with default configuration will show
> 1 | 2
Solution 6 - Php
I recently found that there is in fact a difference. I was having a nightmare of a time with timeout issues until I discovered this. If you use ini_set('max_execution_time', $x) then set_time_limit($y) won't be able to override the setting.
ini_set('max_execution_time', 10);
set_time_limit(20);
ini_get('max_execution_time'); // 10
However this functionality does seem odd to me, it may be that this is a bug unique to my PHP version or something similar.