IT이야기

set_time_limit ()와 ini_set ( 'max_execution_time',…)의 차이점

cyworld 2021. 4. 30. 21:45
반응형

set_time_limit ()와 ini_set ( 'max_execution_time',…)의 차이점


이 두 줄의 코드 사이에 실제 차이가 있습니까?

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

현재 소스 살펴보기 :

/* {{{ 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 소스 코드의 다양한 부분 (mario의 대답에서 참조하는 것을 포함)을 조사했기 때문에 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';

모든 "for"가 성공적으로 완료되었습니다. 이는 모든 경우에 시간이 재설정되었음을 나타냅니다. 인사말

이 코드는 Windows에서만 적용됩니다. 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

참조 URL : https://stackoverflow.com/questions/8914257/difference-between-set-time-limit-and-ini-setmax-execution-time

반응형