programing

set_time_limit()와 ini_set의 차이('max_execution_time', ...)

projobs 2022. 9. 29. 22:00
반응형

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()콜. 애드버타이즈된 타이머 리셋은 실행되지 않는 것 같습니다.(하지만 "timer"는 실제로는 별개의 엔티티는 아니지만 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';

모든 "for"가 정상적으로 완료되었습니다.이는 모든 경우에 시간이 리셋되었음을 나타냅니다.그리팅

이 코드는 윈도우에서만 해당됩니다.예를 들어 php linux의 sleep 시간은 실행 시간을 소비하지 않습니다.

<?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

나는 사실 차이가 있다는 것을 최근에 알았다.이걸 발견하기 전까지 타임아웃 문제로 악몽을 꿨어요ini_set('max_execution_time', $x)을 사용하는 경우 set_time_limit($y)는 설정을 덮어쓸 수 없습니다.

ini_set('max_execution_time', 10);

set_time_limit(20);

ini_get('max_execution_time'); // 10

다만, 이 기능은 이상하다고 생각됩니다만, 이것은 제 PHP 버전에 고유한 버그이거나 비슷한 것일 수 있습니다.

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

반응형