현재 위치: > 최신 기사 목록> register_shutdown_function 어떤 오류를 잡을 수 없습니까? 일반적인 오해 분석

register_shutdown_function 어떤 오류를 잡을 수 없습니까? 일반적인 오해 분석

gitbox 2025-05-26

1. register_shutdown_function에 대한 간단한 설명

register_shutdown_function 의 역할은 PHP 스크립트 실행 끝에 콜백 함수를 등록하는 것입니다. 스크립트가 종료 될 때 호출됩니다. 치명적인 오류를 기록하거나 자원을 해제하거나 후 처리 작업을 수행하는 데 종종 사용됩니다.

 register_shutdown_function(function () {
    $error = error_get_last();
    if ($error !== null) {
        // 오류 처리 로직
        file_put_contents('/tmp/php_error.log', print_r($error, true));
    }
});

2. 캡처 할 수있는 오류의 유형

register_shutdown_function이 잡을 수있는 오류는 일반적으로 스크립트가 종료되기 전에 error_get_last () 에 기록 된 "치명적인 오류"입니다. 잡을 수있는 일반적인 유형의 오류 유형은 다음과 같습니다.

  • e_error : 런타임시 치명적인 오류

  • E_PARSE : 구문 분석 오류 (경우에 따라)

  • e_core_error , e_compile_error : PHP가 시작될 때 치명적인 오류

  • e_user_error : 사용자가 정의한 치명적인 오류

이러한 오류는 일반적으로 스크립트 인터럽트를 유발하며,이 경우 종료 함수는 error_get_last () 를 통해 오류 세부 정보를 실행하고 캡처 할 수 있습니다.


3. 캡처 할 수없는 오류 유형 및 상황

register_shutdown_function 은 강력하지만 전능 한 것은 아닙니다. 다음 유형의 오류 또는 상황은 입술이 없습니다.

1. E_Notice , e_warning 과 같은 치명적인 오류

비 치명적 오류는 스크립트 인터럽트를 유발하지 않으므로 register_shutdown_function 의 오류 처리 로직이 트리거되지 않습니다.

 echo $undefined_variable; // 보고서 notice,실행에는 영향을 미치지 않습니다

종료 함수가 호출되지만 Error_Get_Last () 가 반환 한 내용에는 치명적이지 않은 오류가 포함되지 않습니다.

2. 스크립트를 일찍 종료하는 함수 : exit () 또는 die ()

스크립트가 출구를 통해 적극적으로 종료되거나 종료 되기 전에 치명적인 오류를 던지지 않으면 error_get_last () 의 반환 값은 null 입니다.

 exit("프로그램을 종료하십시오"); // 방아쇠 shutdown,그러나 오류 기록이 없습니다

3. 일부 구문 분석 단계에서 오류를 구문 분석합니다

일부 구문 오류는 PHP 구문 분석 단계에서 발생하며 스크립트는 실행 프로세스에 들어 가지 않습니다 .

 // 다음 코드는 구문 분석이 직접 실패하게됩니다,등록 할 수 없습니다 shutdown 기능
echo "Hello

4. 치명적인 오류가 발생하기 전에 완료되지 않은 출력 버퍼 컨텐츠가 손실됩니다.

"오류가 잡힐 수 없음"은 아니지만 치명적인 오류가 발생하기 전에 OB_START ()가 활성화되지 않으면 페이지의 출력이 손실되어 오류 프롬프트가 없습니다. 이 상황은 종종 "셧다운 기능이 유효하지 않다"고 오인합니다.

5. 오류 억제 문자 @

오류 억제기는 치명적인 오류를 방지하지 않지만 치명적이지 않은 오류의 표시를 억제하여 혼란을 유발할 수 있습니다. register_shutdown_function은 @ 에서도 치명적인 오류를 잡을 수 있습니다.

 @trigger_error("This is a user warning", E_USER_WARNING); // 캡처되지 않습니다

4. 일반적인 오해의 분석

오해 1 : "종료 함수는 모든 오류를 포착 할 수 있습니다"

앞에서 언급했듯이 Register_Shutdown_Function은 치명적인 오류 만 처리 할 수 ​​있으며 일반적인 오류 처리 메커니즘으로 사용할 수 없습니다. e_warninge_notice 의 경우 set_error_handler를 사용해야합니다.

오해 2 : "하나의 셧다운 기능을 사용하면 충분합니다"

오류 처리는 여러 레벨에서 방어해야합니다. 모범 사례는 다음과 같이 사용하는 것입니다.

  • set_error_handler ()는 경고 및 알림과 같은 치명적인 오류를 캡처합니다.

  • set_exception_handler ()가 잡히지 않은 예외를 포착합니다.

  • register_shutdown_function ()은 스크립트가 종료되기 전에 마지막 오류를 캡처합니다.

오해 3 : "출력이 없음 셧다운 함수가 작동하지 않음을 의미합니다"

여러 번 종료가 실제로 실행되지만 Error_Get_Last ()가 NULL을 반환하고 아무것도 기록되지 않기 때문에 개발자는 실수로 기능이 작동하지 않는다고 생각합니다.


5. 오류 처리 아이디어를 올바르게합니다

보다 포괄적 인 오류 처리 시스템의 경우 다음 조합이 권장됩니다.

 set_error_handler('customErrorHandler');
set_exception_handler('customExceptionHandler');
register_shutdown_function('shutdownHandler');

function customErrorHandler($errno, $errstr, $errfile, $errline) {
    // 기록 warning、notice 기다리다
}

function customExceptionHandler($exception) {
    // 기록未捕获异常
}

function shutdownHandler() {
    $error = error_get_last();
    if ($error !== null && in_array($error['type'], [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR])) {
        // 致命错误기록
        file_get_contents('https://gitbox.net/log.php?msg=' . urlencode($error['message']));
    }
}