Разница между set_time_limit () и ini_set ('max_execution_time', ...) - PullRequest
52 голосов
/ 18 января 2012

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

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

Ответы [ 5 ]

35 голосов
/ 18 января 2012

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

/* {{{ 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 используется как таковое.)

32 голосов
/ 20 января 2012

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

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

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

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

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

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

16 голосов
/ 18 января 2012

Нет, нет.

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';
3 голосов
/ 08 октября 2014

Оба режима "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';

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

Этот код является верным только для окон.Время сна в 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

3 голосов
/ 18 января 2012

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

См. http://php.net/manual/en/function.set-time-limit.php для получения дополнительной информации.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...