English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

PHP 기본 튜토리얼

PHP 고급 튜토리얼

PHP & MySQL

PHP 참조 매뉴얼

PHP 오류 처리

이 튜토리얼에서는 PHP의 오류 처리 기능을 사용하여 오류 상황을 고전적으로 처리하는 방법을 배웁니다.

오류 처리

때때이상 애플리케이션이 정상적으로 실행되지 않아 오류가 발생할 수 있습니다. 오류를 일으킬 수 있는 여러 가지 원인이 있습니다. 예를 들어:

  • 웹 서버의 디스크 공간이 부족할 수 있습니다

  • 사용자가 양식 필드에 무효한 값을 입력할 수 있습니다

  • 접근하려는 파일이나 데이터베이스 레코드가 존재하지 않을 수 있습니다

  • 애플리케이션은 디스크에 파일을 쓸 권한이 없을 수 있습니다

  • 애플리케이션이 접근할 수 있는 서비스가 일시적으로 사용할 수 없을 수 있습니다

이러한 유형의 오류는 스크립트 실행 중에 발생하기 때문에 실행 시간 오류라고 합니다. 스크립트 실행 전에 수정해야 할 문법 오류와는 다릅니다.

전문적인 애플리케이션은 이러한 실행 시간 오류를 적절히 처리할 수 있는 기능을 가지고 있어야 합니다. 일반적으로 이는 사용자에게 명확하고 정확하게 문제가 무엇인지 알려주는 것을 의미합니다.

오류 등급 이해

일반적으로 스크립트가 정상적으로 실행되지 못하게 만드는 문제가 발생하면 PHP 엔진이 오류를 트리거합니다. 각 오류는 정수 값과 관련된 상수로 표현됩니다. 다음 표는 일부 일반적인 오류 등급을 나열합니다:

오류 등급설명
E_ERROR1

결정적인 실행 시간 오류입니다. 복구할 수 없습니다. 스크립트의 실행은 즉시 중단됩니다.

E_WARNING2

실행 시간 경고입니다. 이는 결정적인 오류가 아니며 대부분의 오류가 이 범주에 포함됩니다. 스크립트의 실행은 중단되지 않습니다.

E_NOTICE8

실행 시간 알림입니다. 스크립트가 오류가 발생할 수 있는 상황을 만났음을 나타냅니다. 하지만 이 상황이 스크립트가 정상적으로 실행될 때도 발생할 수 있습니다.

E_USER_ERROR256

사용자가 생성한 결정적인 오류 메시지입니다. 이는 E_ERROR과 유사하지만 PHP 스크립트가 trigger_error() 함수를 사용하여 PHP 엔진이 생성한 것이 아닌 것입니다.

E_USER_WARNING512사용자가 생성한 비致命적인 경고 메시지입니다. 이는 E_WARNING과 유사하지만 PHP 스크립트가 trigger_error() 함수를 사용하여 PHP 엔진이 생성한 것이 아닌 것입니다.
E_USER_NOTICE1024

사용자가 생성한 알림 메시지입니다. 이는 E_NOTICE와 유사하지만 PHP 스크립트가 trigger_error() 함수를 사용하여 PHP 엔진이 생성한 것이 아닌 것입니다.

E_STRICT2048

실제로는 오류가 아니지만 PHP가 문제가 발생할 수 있는 또는 상호 불일치가 발생할 수 있는 코드를 만나면 트리거됩니다

E_ALL8191

모든 오류와 경고, PHP 5.4.0 이전의 E_STRICT을 제외.

더 많은 오류 수준에 대해, 관련 문서를 참조하세요.PHP 오류 수준참조.

PHP 스크립트가 문제를 만날 때마다 PHP 엔진이 오류를 트리거하지만, 사용자가 더 사용자 친화적인 오류 메시지를 생성하기 위해 오류를 직접 트리거할 수도 있습니다. 이렇게 하면 응용 프로그램을 더 복잡하게 만들 수 있습니다. PHP 오류 처리를 위해 일반적으로 사용되는 몇 가지 방법에 대해 다음에 설명합니다:

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

다음 예제를 고려해 보세요. 이 예제는 단지 텍스트 파일을 읽기 전용으로 열려고 시도합니다.

<?php
//불存在的文件尝试打开
$file = fopen("sample.txt", "r");
?>

파일이 없을 경우, 다음과 같은 오류를 받을 수 있습니다:

경고: fopen(sample.txt) [function.fopen]: 파일이나 디렉토리가 존재하지 않습니다: C:\wamp\www\project\test.php line 2

이러한 오류 메시지를 사용자가 받지 않도록了一些简单的步骤,则可以防止用户收到此类错误消息。

<?php
if(file_exists("sample.txt")){
    $file = fopen("sample.txt", "r");
} else {
    die("오류: 접근하려는 파일이 존재하지 않습니다.");
}
?>

위 스크립트를 실행하면 다음과 같은 오류 메시지를 받게 됩니다:

오류: 접근하려는 파일이 존재하지 않습니다.

그렇게 보면, 파일이 존재하는지 간단한 확인을 통해 사용자에게 더 의미 있는 오류 메시지를 생성할 수 있습니다.

“sample.txt” 파일이 없을 경우, 위에서 사용한 die() 함수는 단지 사용자 정의 오류 메시지를 표시하고 현재 스크립트를 종료합니다.

사용자 정의 오류 처리 프로그램 생성

PHP 엔진이 생성하는 실행 시 오류를 처리하기 위해 자신의 오류 처리 함수를 생성할 수 있습니다. 사용자 정의 오류 처리 프로그램은 더 큰 유연성과 오류에 대한 더 나은 통제를 제공하며, 오류를 확인하고 오류 처리 방법을 결정할 수 있습니다. 사용자에게 메시지를 표시하거나 파일이나 데이터베이스에 오류를 기록하거나 이메일을 통해 전송하거나 문제를 해결하고 스크립트 실행을 계속하거나 스크립트 실행을 종료하거나 오류를 완전히 무시할 수 있습니다.
사용자 정의 오류 처리 함수는 최소한 두 개의 매개변수 (errno와 errstr)를 처리해야 하지만, 다른 세 개의 매개변수 (errfile, errline, errcontext)를 받을 수 있습니다. 다음과 같이 설명됩니다:

파라미터설명
필수 - 다음 파라미터는 필수입니다
errno오류 수준을 정수로 지정합니다. 이는 적절한 오류 수준 상수(E_ERROR, E_WARNING 등)와 일치합니다
errstr오류 메시지를 문자열로 지정
선택 사항 - 다음 파라미터는 선택 사항입니다
errfile오류가 발생한 스크립트 파일의 이름을 문자열로 지정
errline오류가 발생한 행 번호를 문자열로 지정
errcontext오류가 발생할 때 존재하는 모든 변수와 그 값이 포함된 배열을 지정합니다. 디버깅에 유용합니다

다음은 간단한 사용자 정의 오류 처리 함수 예제입니다. 무엇이든 오류가 발생하면 이 처리기를 trigge

<?php
//오류 처리 함수
function customError($errno, $errstr){
    echo "<b>Error:</b> [$errno] $errstr";
}
?>

PHP가 사용자 정의 오류 처리 함수를 사용하도록 알려야 합니다-내장된 set_error_handler() 함수를 호출하고 함수 이름을 전달하면 됩니다。

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

오류 기록

텍스트 파일에 오류 메시지를 기록

오류의 상세 정보를 다음과 같이 로그 파일에 기록할 수 있습니다:

<?php
function calcDivision($dividend, $divisor) {
    if($divisor == 0) {
        trigger_error("calcDivision(): 除数不能为零", E_USER_WARNING);
        return false;
    } else {
        return($dividend / $divisor);
    }
}
function customError($errno, $errstr, $errfile, $errline, $errcontext){
    $message = date("Y-m-d H:i:s - ");
    $message .= "에러: [" . $errno ."], " . "$errstr in $errfile on line $errline, ";
    $message .= "변수들:" . print_r($errcontext, true) . "\r\n";
    
    error_log($message, 3, "logs/app_errors.log");
    die("문제가 발생했습니다. 다시 시도하세요。");
}
set_error_handler("customError");
echo calcDivision(10, 0);
echo "이 메시지는 절대 출력되지 않습니다。";
?>

오류 메시지를 이메일로 전송

도 같은 error_log() 함수를 사용하여 오류 상세 정보를 포함한 이메일을 보낼 수 있습니다。

<?php
function calcDivision($dividend, $divisor) {
    if ($divisor == 0){
        trigger_error("calcDivision(): 除数不能为零", E_USER_WARNING);
        return false;
    } else {
        return($dividend / $divisor);
    }
}
function customError($errno, $errstr, $errfile, $errline, $errcontext){
    $message = date("Y-m-d H:i:s - ");
    $message .= "에러: [" . $errno ."], " . "$errstr in $errfile on line $errline, ";
    $message .= "변수들:" . print_r($errcontext, true) . "\r\n";
    
    error_log($message, 1, "[email protected]");
    die("문제가 발생했습니다. 다시 시도하세요. 오류 보고서는 웹마스터에게 제출되었습니다.");
}
set_error_handler("customError");
echo calcDivision(10, 0);
echo "이 내용은 출력되지 않습니다.";
?>

오류 발생

PHP 엔진이 스크립트 문제를 만날 때 오류를 발생시키지만, 여러분도 오류를 발생시킬 수 있습니다. 이는 가능한 문제가 심각한 오류로 발전하기 전에 문제를 표시하는 데 도움이 됩니다.

스크립트 내에서 오류를 발생시키려면 trigger_error() 함수를 호출하고 생성할 오류 메시지를 전달하세요:

trigger_error("문제가 발생했습니다.");

다음은 두 숫자를 분할하는 함수를 고려해 보겠습니다.

<?php
function calcDivision($dividend, $divisor) {
    return($dividend / $divisor);
}
 
//함수 호출
echo calcDivision(10, 0);
?>

0 값을 $divisor 매개변수로 전달하면 PHP 엔진이 생성하는 오류는 다음과 유사합니다:

경고: C:\wamp\www\project\test.php 파일의 line에서 0으로의 분할 3

이 메시지는 내용이 많지 않아 보입니다. 다음은 trigger_error() 함수를 사용하여 오류를 생성하는 예제입니다.

<?php
function calcDivision($dividend, $divisor) {
    if($divisor == 0) {
        trigger_error("분할자는 0이 될 수 없습니다.", E_USER_WARNING);
        return false;
    } else {
        return($dividend / $divisor);
    }
}
 
//함수 호출
echo calcDivision(10, 0);
?>

지금, 스크립트가 이 오류 메시지를 생성합니다:

경고: C:\wamp\www\project\error.php 파일의 line에서 분할자는 0이 될 수 없습니다. 4  	

그러나 보시다시피, 두 번째 예제에서 생성된 오류 메시지는 이전 예제보다 문제를 더 명확하게 설명합니다.