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

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

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

Related of "Разница между set_time_limit () и ini_set ('max_execution_time', …)"

Рассматривая текущий источник :

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

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

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

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

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

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

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

Нет, нет.

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

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

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

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

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

Оба режима: «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