Подтвердить что ты не робот

Разница между set_time_limit() и ini_set ('max_execution_time',...)

Есть ли какая-либо фактическая разница между этими двумя строками кода?

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

Ответ 1

Глядя на текущий :

/* {{{ 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(). Кажется, он даже не выполняет рекламируемый таймер reset. (Но я бы предположил, что "таймер" фактически не является отдельной сущностью, но само значение ini используется как таковое.)

Ответ 2

Небольшое различие, которое следует учитывать, это то, как они себя ведут при сбое:

  • set_time_limit() ничего не возвращает, поэтому вы не можете использовать его для определения того, удалось ли это выполнить. Кроме того, он выдает предупреждение:

    Предупреждение: set_time_limit(): не удается установить ограничение по времени в безопасном режиме

  • ini_set() возвращает FALSE при сбое и не вызывает предупреждений.

На практике это не должно быть много, поскольку безопасный режим, как утверждается, является единственной ситуацией, которая может привести к сбою, а функция уже устарела.

Кроме того, эта функция является просто оболочкой для изменения свойства.

Ответ 3

Нет. Нет.

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

Что касается таймера reset, в обоих случаях это reset:

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';

Ответ 4

Согласно руководству php, set_time_limit() будет reset таймером выполнения при вызове. Я не верю, что ini_set() имеет тот же побочный эффект, который был бы разницей между ними.

Подробнее см. http://php.net/manual/en/function.set-time-limit.php.

Обновление: после изучения различных частей исходного кода php (включая ссылки, на которые ссылается ответ mario), я пришел к выводу, что ini_set() и set_time_limit() в точности эквивалентны.

ini_set() действительно reset таймер (хотя я все еще не понимаю, как любая функция выполняет reset, мне придется искать функцию, которая убивает script, когда таймер заканчивается, чтобы увидеть, что один из них).

Ответ 5

Оба режима: "set_time_limit (5)" и "ini_set (" max_execution_time "," 5 ")" reset время, практичный и понятный пример:

//-----------------------------------------------------------
//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';

Все "для" успешно завершены, это означает, что во всех случаях время reset Приветствия

Этот код действителен только для окон. Время сна в 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 с настройкой по умолчанию будет показывать

1 | 2