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
'programing' 카테고리의 다른 글
PHP 개체 배열 (0) | 2022.09.29 |
---|---|
프로젝트 중 C 프로그램에서 소스 코드를 읽는 방법은 무엇입니까? (0) | 2022.09.29 |
시간대 문제를 수정하기 위해 추가 파라미터를 MariaDB 연결 문자열에 전달하는 방법(예: useLegacyDatetimeCode) (0) | 2022.09.29 |
PHP 치명적 오류:오브젝트 컨텍스트가 아닌 경우 $this 사용 (0) | 2022.09.29 |
오류 2002(HY000):소켓 '/var/run/mysql'을 통해 로컬 MySQL 서버에 연결할 수 없습니다.양말' (2) (0) | 2022.09.25 |