PHP 오류 처리

PHP에서 기본적인 오류 처리는 매우 간단합니다. 파일 이름, 행 번호 및 오류 메시지를 포함한 메시지가 브라우저로 전송됩니다.

PHP 오류 처리

在创建脚本和 web 应用程序时,错误处理是一个重要的部分。如果您的代码缺少错误检测编码,那么程序看上去很不专业,也为安全风险敞开了大门。

스크립트와 웹 애플리케이션을 생성할 때, 오류 처리는 중요한 부분입니다. 코드에 오류 검출 코드가 부족하다면, 프로그램은 전문적이지 않고, 보안 위험이 높아집니다.

이 튜토리얼은 PHP에서 가장 중요한 오류 검출 방법을 소개합니다.

  • 다양한 오류 처리 방법을 안내해 드리겠습니다:
  • 간단한 "die()" 문
  • 사용자 정의 오류 및 오류 트리거

오류 보고

기본적인 오류 처리: die() 함수 사용

<?php
$file=fopen("welcome.txt","r");
?>

파일이 없다면, 이와 같은 오류를 받게 됩니다:

경고: fopen(welcome.txt) [function.fopen]: 스트림 열기에 실패했습니다: 
파일이나 디렉토리가 없음 C:\webfolder\test.php 라인 2

위와 같은 오류 메시지를 사용자에게 제공되지 않도록 하기 위해, 파일에 접근하기 전에 파일이 존재하는지 확인합니다:

<?php
if(!file_exists("welcome.txt"))
 {
 die("파일이 없음");
 }
else
 {
 $file=fopen("welcome.txt","r");
 }
?>

지금, 파일이 없다면, 이와 같은 오류 메시지를 받게 됩니다:

파일이 없음

이전 코드보다 위 코드는 더 효율적입니다. 이는 오류가 발생한 후 스크립트를 종료하는 간단한 오류 처리 기계를 사용했기 때문입니다.

그러나 스크립트를 단순히 종료하는 것은 항상 적절한 방법이 아닙니다. 오류 처리를 위한 PHP 함수의 대안을 연구해 보겠습니다.

사용자 정의 오류 처리기 생성

사용자 정의 오류 처리기 생성은 매우 간단합니다. PHP에서 오류가 발생할 때 호출할 수 있는 전용 함수를 간단하게 생성했습니다.

이 함수는 최소 두 개의 파라미터(error level과 error message)를 처리할 수 있는 능력이 있어야 하지만, 최대 다섯 개의 파라미터(선택 사항: 파일, 라인 번호 및 error context)를 받을 수 있습니다:

문법

error_function(error_level, error_message,
error_file, error_line, error_context)
파라미터 설명
error_level

필수입니다. 사용자 정의 오류 규정에 따른 오류 보고 등급입니다. 반드시 값 숫자여야 합니다.

다음 표를 참조하세요: 오류 보고 등급.

error_message 필수입니다. 사용자 정의 오류 규정에 따른 오류 메시지입니다.
error_file 선택 사항. 오류가 발생한 파일 이름을 정의합니다.
error_line 선택 사항. 오류가 발생한 행 번호를 정의합니다.
error_context 선택 사항. 오류가 발생할 때 사용 중인 각 변수와 그 값이 포함된 배열을 정의합니다.

오류 보고 레벨

이 오류 보고 레벨은 오류 처리 프로그램이 처리하려는 오류의 다른 유형을 목표로 합니다:

상수 설명
2 E_WARNING 비 致명한 run-time 오류. 스크립트 실행을 중단하지 않습니다.
8 E_NOTICE

Run-time 알림.

스크립트가 오류가 발생할 수 있음을 발견했지만, 스크립트가 정상적으로 실행 중일 때도 발생할 수 있습니다.

256 E_USER_ERROR 사용자 생성된 致命 오류. 프로그래머가 PHP 함수 trigger_error()를 사용하여 설정한 E_ERROR과 유사합니다.
512 E_USER_WARNING 사용자 생성된 비 致命 경고. 프로그래머가 PHP 함수 trigger_error()를 사용하여 설정한 E_WARNING과 유사합니다.
1024 E_USER_NOTICE 사용자 생성된 알림. 프로그래머가 PHP 함수 trigger_error()를 사용하여 설정한 E_NOTICE와 유사합니다.
4096 E_RECOVERABLE_ERROR 캡처할 수 있는 致命 오류. E_ERROR과 유사하지만 사용자 정의 처리 프로그램에 의해 캡처될 수 있습니다. (set_error_handler() 참조)
8191 E_ALL

모든 오류와 경고, E_STRICT를 제외한 모든 것.

(PHP 6.0에서 E_STRICT는 E_ALL의 일부입니다)

지금, 오류를 처리하는 함수를 생성해 보겠습니다:

function customError($errno, $errstr)
 { 
 echo "<b>오류:</b> [$errno] $errstr<br />";
 echo "스크립트 종료";
 die();
 }

위의 코드는 간단한 오류 처리 함수입니다. 트리거되면 오류 레벨과 오류 메시지를 가져옵니다. 그런 다음 오류 레벨과 메시지를 출력하고 스크립트를 종료합니다.

지금까지 오류 처리 함수를 생성했으므로 이 함수가 언제 트리거되는지 결정해야 합니다.

Set Error Handler

PHP의 기본 오류 처리 프로그램은 내장된 오류 처리 프로그램입니다. 위의 함수를 스크립트 실행 중 기본 오류 처리 프로그램으로 만들려고 합니다.

오류 처리 프로그램을 수정하여 특정 오류에만 적용할 수 있도록 하여 스크립트가 다른 방식으로 다른 오류를 처리할 수 있습니다. 그러나 이 예제에서는 모든 오류에 대해 우리의 커스텀 오류 처리 프로그램을 사용하려고 합니다:

set_error_handler("customError");

우리의 커스텀 함수가 모든 오류를 처리하도록 원하기 때문에 set_error_handler()는 단 하나의 매개변수만 필요하며 두 번째 매개변수를 추가하여 오류 레벨을 정의할 수 있습니다.

예제

미정의된 변수를 출력하려고 시도하여 이 오류 처리기를 테스트합니다:

<?php
//오류 처리기 함수
function customError($errno, $errstr)
 { 
 echo "<b>오류:</b> [$errno] $errstr";
 }
//오류 처리기 설정
set_error_handler("customError");
//오류 트리거
echo($test);
?>

위 코드의 출력은 다음과 같아야 합니다:

오류: [8] 정의되지 않은 변수: test

오류 유발

스크립트에서 사용자 입력 데이터의 위치에서 사용자 입력이 유효하지 않을 때 오류를 유발하는 것이 매우 유용합니다. PHP에서는 이 작업을 trigger_error()가 수행합니다.

예제

이 예제에서 "test" 변수가 "1"보다 크면 오류가 발생합니다:

<?php
$test=2;
if ($test>1)
{
trigger_error("Value must be 1 or below");
}
?>

위 코드의 출력은 다음과 같아야 합니다:

참고: 값은 1 또는 이하여야 합니다
in C:\webfolder\test.php on line 6

스크립트의 어느 위치에서든 오류를 유발할 수 있으며, 추가된 두 번째 파라미터를 사용하여 유발할 오류 레벨을 지정할 수 있습니다.

가능한 오류 유형:

  • E_USER_ERROR - 치명적인 사용자가 생성한 런타임 오류. 오류는 복구할 수 없습니다. 스크립트 실행이 중단됩니다.
  • E_USER_WARNING - 치명적이지 않은 사용자가 생성한 런타임 경고. 스크립트 실행이 중단되지 않습니다.
  • E_USER_NOTICE - 기본. 사용자가 생성한 런타임 알림. 스크립트가 가능한 오류를 발견했을 수도 있으며, 스크립트가 정상적으로 실행 중일 때도 발생할 수 있습니다.

예제

이 예제에서 "test" 변수가 "1"보다 크면 E_USER_WARNING 오류가 발생합니다. E_USER_WARNING가 발생하면 사용자 정의 오류 처리기를 사용하여 스크립트를 종료합니다:

<?php
//오류 처리기 함수
function customError($errno, $errstr)
 { 
 echo "<b>오류:</b> [$errno] $errstr<br />";
 echo "스크립트 종료";
 die();
 }
//오류 처리기 설정
set_error_handler("customError", E_USER_WARNING);
//오류 트리거
$test=2;
if ($test>1)
 {
 trigger_error("값은 1 또는 그 이하여야 합니다", E_USER_WARNING);
 }
?>

위 코드의 출력은 다음과 같아야 합니다:

오류: [512] 값은 1 또는 그 이하여야 합니다
스크립트 종료

지금까지 우리는 자신의 error를 생성하고, 그들을 유발하는 방법을 배웠습니다. 지금은 오류 기록에 대해 살펴보겠습니다.

오류 기록

기본적으로 php.ini에 있는 error_log 설정에 따라 PHP는 서버의 오류 기록 시스템이나 파일로 오류 기록을 보냅니다. error_log() 함수를 사용하면 지정된 파일이나 원격 대상으로 오류 기록을 보낼 수 있습니다.

자신에게 이메일을 통해 오류 메시지를 전송하는 것은 특정 오류를 알림을 받는 좋은 방법입니다.

이메일을 통해 오류 메시지를 전송합니다

아래의 예제에서 특정 오류가 발생하면 오류 메시지를 포함한 이메일을 보내고 스크립트를 종료하겠습니다:

<?php
//오류 처리기 함수
function customError($errno, $errstr)
 { 
 echo "<b>오류:</b> [$errno] $errstr<br />";
 echo "웹마스터가 알림을 받았습니다";
 error_log("오류: [$errno] $errstr",1,
 "someone@example.com","From: webmaster@example.com");
}
//오류 처리기 설정
set_error_handler("customError", E_USER_WARNING);
//오류 트리거
$test=2;
if ($test>1)
 {
 trigger_error("값은 1 또는 그 이하여야 합니다", E_USER_WARNING);
 }
?>

위 코드의 출력은 다음과 같아야 합니다:

오류: [512] 값은 1 또는 그 이하여야 합니다
웹마스터가 알림을 받았습니다

위 코드에서 받은 이메일은 다음과 같습니다:

오류: [512] 값은 1 또는 그 이하여야 합니다

이 방법은 모든 오류에 적합하지 않습니다. 일반 오류는 서버에서 기본 PHP 기록 시스템을 사용하여 기록해야 합니다.