Difference between set_time_limit() and ini_set('max_execution_time', ...)

Php

Php 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() returns FALSE 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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Question&#193;lvaro Gonz&#225;lezView Question on Stackoverflow
Solution 1 - PhpmarioView Answer on Stackoverflow
Solution 2 - PhpÁlvaro GonzálezView Answer on Stackoverflow
Solution 3 - PhpwebbiedaveView Answer on Stackoverflow
Solution 4 - PhpChris BrowneView Answer on Stackoverflow
Solution 5 - PhpFernandoView Answer on Stackoverflow
Solution 6 - PhpShardjView Answer on Stackoverflow