728x90
오늘은 이전에 알아본 set_error_handler를 사용해 처리할 수 없는 에러가 발생했을 때 처리하는 메소드를 실행하는 방법을 알아보겠습니다.
https://stickode.tistory.com/975
PHP 스크립트에서 register_shutdown_function() 메소드를 사용해 설정할 수 있습니다.
설정하는 방법은 다음과 같습니다.
register_shutdown_function(callable $callback, mixed ...$args): void
$callback : 콜백 메소드는 스크립트가 정상 종료되거나 중지되었을 때 실행할 메소드를 설정
$args : 콜백 메소드에 전달할 변수를 설정(필수 아님)
위 내용을 바탕으로 예제를 하나 만들어 보겠습니다.
function shutdownErrorHandler()
{
echo 'shutdownErrorHandler executed', PHP_EOL;
// 마지막으로 발생한 에러 확인
$error = error_get_last();
// set_error_handler()가 처리할 수 없는 에러인지 확인
$error_type = $error['type'];
if(($error_type === E_ERROR) || ($error_type === E_PARSE) || ($error_type === E_CORE_ERROR) || ($error_type === E_CORE_WARNING) || ($error_type === E_COMPILE_ERROR) || ($error_type === E_COMPILE_WARNING)) {
// 에러가 잡히면 로그를 남기기 위한 코드를 작성
$logDate = date("Ymd"); // 오늘의 날짜를 변수로 저장
$dirName = "log"; // 로그 폴더 이름 저장
// log 폴더 존재 확인
if(is_dir($dirName)){
opendir($dirName); // log 폴더가 존재한다면 폴더 열기
}else{
mkdir($dirName) // log 폴더가 존재하지 않는다면 생성
}
// 오늘 날짜로 log 파일 이름 설정
$fileName = $logData."log";
// fopen() 메소드를 사용해 이미 파일이 있다면 추가로 작성
// 파일이 없다면 새로 생성해 작성
$fp = fopen("./log/".$fileName, 'a+');
// log 파일 기록 시작
fwrite( $fp,"************************************************\r\n");
fwrite( $fp,"에러발생일시 : ".date("YmdHis")."\r\n");
fwrite( $fp,"에러 타입 : ".$error['type']."\r\n");
fwrite( $fp,"에러 메시지 : ".$error['message']."\r\n");
fwrite( $fp,"에러 발생 파일이름 : ".$error['file']."\r\n");
fwrite( $fp,"에러 발생한 줄 : ".$error['line']."\r\n");
// log 파일 작성 종료
fclose($fp);
}
}
// string을 매개변수로 받아 출력하는 메소드
function myFunction (a_value: String) {
echo a_value;
}
// 스크립트 종료 또는 중지 시 실행할 메소드 설정
register_shutdown_function('shutdownErrorHandler');
// 강제로 E_ERROR를 발생시키기 위한 코드
myFunction(123);
이렇게 register_shutdown_function() 메소드를 사용해서 사용자가 set_error_handler()를 통해 처리하지 못했던 에러들을 log 기록을 남겨 추후 에러가 발생하지 않게 처리할 수 있게 도와주는 방법을 알아보았습니다.
'PHP' 카테고리의 다른 글
[PHP] 에러 보고 받기 (2) | 2023.11.29 |
---|---|
[PHP] 위도, 경도 값을 활용하여 거리순으로 출력하기 (2) | 2023.11.25 |
[PHP] 사용자 정의 예외 처리기[set_exception_handler()] 정의하기 (0) | 2023.11.10 |
[PHP] 사용자 정의 오류 처리기[set_error_handler()] 정의하기 (0) | 2023.10.31 |
[PHP] Retrofit 라이브러리를 사용해서 서버에 파일 업로드하기(서버) (0) | 2023.10.20 |