73

Is there any actual difference between these two lines of code?

ini_set('max_execution_time', 20*60);
set_time_limit(20*60);
Álvaro González
  • 142,137
  • 41
  • 261
  • 360

6 Answers6

45

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.)

Álvaro González
  • 142,137
  • 41
  • 261
  • 360
mario
  • 144,265
  • 20
  • 237
  • 291
41

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.

Álvaro González
  • 142,137
  • 41
  • 261
  • 360
24

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';
webbiedave
  • 48,414
  • 8
  • 88
  • 101
3

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

zx485
  • 28,498
  • 28
  • 50
  • 59
Fernando
  • 1,126
  • 12
  • 13
3

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).

Chris Browne
  • 1,582
  • 3
  • 15
  • 33
  • I see no evidence of the lack of timer reset when setting via `ini_set` (YMMV, increase/decrease loop if necessary): http://codepad.viper-7.com/iTsOTR – webbiedave Jan 18 '12 at 17:32
  • Well, I was just going by the manual and hadn't performed any tests - I will try to confirm your results and update my answer accordingly. – Chris Browne Jan 19 '12 at 12:28
-1

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.

Shardj
  • 1,800
  • 2
  • 17
  • 43