본문 바로가기
PHP

[PHP] ERROR 대비 종료 시 실행할 메소드 설정하기

by teamnova 2023. 11. 19.
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 기록을 남겨 추후 에러가 발생하지 않게 처리할 수 있게 도와주는 방법을 알아보았습니다.