PHP 오류 처리LOGIN

PHP 오류 처리

PHP에서는 기본 오류 처리가 간단합니다. 파일 이름, 줄 번호 및 오류를 설명하는 메시지와 함께 오류 메시지가 브라우저로 전송됩니다.


PHP 오류 처리

스크립트 및 웹 애플리케이션 생성 시 오류 처리하는 것이 중요한 부분입니다. 코드에 오류 감지 코딩이 없으면 프로그램이 비전문적으로 보이고 보안 위험이 발생할 수 있습니다.

이 튜토리얼에서는 PHP에서 가장 중요한 오류 감지 방법 중 일부를 다룹니다.

다양한 오류 처리 방법을 설명해 드리겠습니다.

· 간단한 "die()" 문

· 사용자 정의 오류 및 오류 트리거

· 오류 보고


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

첫 번째 예는 텍스트 파일을 여는 간단한 스크립트를 보여줍니다.

<?php
$open=fopen('error.txt','r');
echo $open;
?>

파일이 없으면 다음과 같은 오류가 발생합니다.

경고: fopen(error.txt) [function.fopen]: 스트림을 열지 못했습니다:
2번째 줄의 /www/php/test/test.php에 해당 파일이나 디렉터리가 없습니다

사용자가 위와 유사한 오류 메시지를 받는 것을 방지하기 위해 확인하기 전에 파일을 방문합니다. 파일이 존재하는 경우:

<?php
header("Content-type:text/html;charset=utf-8");
if(!file_exists('error.txt')){
    die("文件不存在");
}else{
    $file=fopen('error.txt','r');
}
?>

이제 파일이 존재하지 않으면 다음과 같은 오류 메시지가 표시됩니다:

파일이 존재하지 않습니다

이전 코드에 비해 위 코드는 오류 발생 후 스크립트를 종료하기 위해 간단한 오류 처리 메커니즘을 사용하기 때문에 더 효율적입니다.

그러나 단순히 스크립트를 종료하는 것이 항상 적절한 것은 아닙니다. 오류 처리를 위한 대체 PHP 함수를 살펴보겠습니다.


사용자 정의 오류 핸들러 만들기

사용자 정의 오류 핸들러 만들기 매우 간단합니다. PHP에서 오류가 발생할 때 호출할 수 있는 전용 함수를 간단히 만들었습니다.

함수는 최소 2개의 매개변수(오류 수준 및 오류 메시지)를 처리할 수 있어야 하지만 최대 5개의 매개변수(선택 사항: 파일, 줄 번호 및 오류 컨텍스트)를 허용할 수 있습니다.

error_function (error_level,error_message,error_file,error_line,error_context)


      参数      描述


  error_level

必需。为用户定义的错误规定错误报告级别。必须是一个数字。参见下面的表格:错误报告级别。
  error_message必需。为用户定义的错误规定错误消息。

  error_file可选。规定错误发生的文件名。
  error_line可选。规定错误发生的行号。
  error_context可选。规定一个数组,包含了当错误发生时在用的每个变量以及它们的值。

오류 보고 수준

이 오류 보고 수준은 사용자 정의 오류 처리기에 의해 처리됩니다. 다양한 유형 오류 수:

           常量    描述
    2E_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。
값<🎜><🎜>
<🎜>상수<🎜>< 🎜> <🎜> 설명<🎜><🎜>
2E_경고치명적이지 않은 실행 -시간 오류. 스크립트 실행을 일시 중지하지 마십시오.
<🎜 >  <🎜><🎜> 8<🎜><🎜><🎜>
<🎜><🎜>E_NOTICE<🎜>
런타임 알림. 스크립트가 가능한 오류를 발견할 때 발생하지만 스크립트가 정상적으로 실행될 때도 발생할 수 있습니다.
<🎜 > <🎜><🎜> 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

所有错误和警告。(在 PHP 5.4 中,E_STRICT 成为 E_ALL 的一部分)
     <🎜><🎜>    1024<🎜><🎜>< /td>
<🎜>
<🎜> <🎜>E_USER_NOTICE<🎜>
용户生成일반적인 정보입니다. PHP는 Trigger_error()를 사용하여 E_NOTICE를 사용합니다.
<🎜>     <🎜><🎜>    4096<🎜><🎜> <🎜>
<🎜><🎜>
<🎜><🎜>E_RECOVERABLE_ERROR<🎜>
모든 것이 옳습니다. "상단" 스타일="테두리 너비: 1px; 테두리 스타일: 단색; word-break: break-all;"><🎜>     <🎜><🎜>    8191<🎜><🎜><🎜>
<🎜><🎜>E_ALL<🎜>
所有错误와警告。(PHP 5.4 中,E_STRICT 成为 E_ALL 的一分)

이제 오류를 처리하는 함수를 만들어 보겠습니다.

<?php
header("Content-type:text/html;charset=utf-8");
function customError($errno, $errstr)
{
    echo "<b>Error:</b> [$errno] $errstr<br>";
    echo "脚本结束";
    die();
}
?>

위 코드는 Simple 오류 처리 기능. 트리거되면 오류 수준과 오류 메시지가 표시됩니다. 그런 다음 오류 수준과 메시지를 인쇄하고 스크립트를 종료합니다.

이제 오류 처리 기능을 만들었으므로 언제 실행할지 결정해야 합니다.


오류 핸들러 설정

PHP의 기본 오류 핸들러가 내장되어 있습니다. 오류 처리기. 스크립트가 실행될 때 위 함수를 기본 오류 처리기로 변환하겠습니다.

오류 핸들러를 수정하여 특정 오류에만 적용하면 스크립트가 다양한 오류를 다양한 방식으로 처리할 수 있습니다. 그러나 이 경우 모든 오류에 대해 사용자 정의 오류 핸들러를 사용할 것입니다:

set_error_handler("customError");

이후 우리는 사용자 정의 함수가 모든 오류를 처리하기를 원합니다. set_error_handler()에는 하나의 매개변수만 필요하며 오류 수준을 지정하기 위해 두 번째 매개변수를 추가할 수 있습니다.


위에서 배운 지식을 결합하고 존재하지 않는 변수를 출력하여 이 오류 처리기를 테스트합니다.

<?php
header("Content-type:text/html;charset=utf-8");
// 错误处理函数
function customError($errno, $errstr)
{
    echo "<b>Error:</b> [$errno] $errstr";
}
// 设置错误处理函数
set_error_handler("customError");
// 触发错误
echo($test);
//关闭了所有的错误显示
error_reporting(0);
//显示所有错误
//error_reporting(E_ALL);
//显示所有错误,但不显示提示
//error_reporting(E_ALL & ~ E_NOTICE);
?>

프로그램 실행 결과:

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

실행 결과에 따르면 오류 수준은 8입니다. , 오류 메시지는 다음과 같습니다. 존재하지 않는 변수


는 사용자가 스크립트에 데이터를 입력하는 경우

오류를 유발합니다. 유용합니다. 사용자의 입력이 유효하지 않을 때 오류를 유발합니다. PHP에서 이 작업은 Trigger_error() 함수로 수행됩니다.

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

<?php
header("Content-type:text/html;charset=utf-8");
$test=2;
if ($test>1)
{
    trigger_error("变量值必须小于等于 1");
}
?>

프로그램 실행 결과:

주의: 6행의 D:WWWAdvanced tutorialerrorerror_1.php에서 변수 값은 1보다 작거나 같아야 합니다


스크립트의 어느 위치에서나 오류를 트리거할 수 있으며, 두 번째 매개변수를 추가하여 트리거되는 오류 수준을 지정할 수 있습니다.

가능한 오류 유형:

· E_USER_ERROR - 사용자가 생성한 치명적인 런타임 오류입니다. 오류를 복구할 수 없습니다. 스크립트 실행이 중단되었습니다.

· E_USER_WARNING - 치명적이지 않은 사용자 생성 런타임 경고입니다. 스크립트 실행이 중단되지 않습니다.

· E_USER_NOTICE - 기본값. 사용자가 생성한 런타임 알림. 스크립트가 가능한 오류를 발견할 때 발생하지만 스크립트가 정상적으로 실행될 때도 발생할 수 있습니다.


예제

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

<?php
header("Content-type:text/html;charset=utf-8");
// 错误处理函数
function customError($errno, $errstr)
{
    echo "<b>Error:</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
스크립트가 종료됩니다

실행 결과는 오류 수준 값이 512임을 알려줍니다. 오류 메시지는 Trigger_error 함수로 설정한 프롬프트 메시지가 됩니다


오류 로깅

일부 회사에서는 특별한 로그 수집 시스템이 있습니다. 로그 수집 시스템은 뒤에서 오류, 경고 및 프롬프트를 수집하는 데 자동으로 도움을 줍니다.

전용 로그 수집 시스템이 없고 서버에서 실행 중인 로그를 파일을 통해 수집하는 회사도 있습니다.

이중 PHP 오류, 경고를 받아야 합니다.

그러면 질문이 생깁니다. 오류 보고 수준이 사용자가 보기 훨씬 전에 설정되어 있다면 오류를 로그 시스템에 어떻게 수집할 것인가?

php.ini에서 사용해야 하는 관련 구성 항목은 다음과 같습니다. 이 두 가지 구성 항목은 다음과 같습니다.

< tr >< / 테이블>

아아앙

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

<?php
//无法连接到数据库服务器,直接记录到php.ini 中的error_log指定位置
error_log("无法连接到数据库服务器服务器");
//可以发送邮件,但是php.ini必须配置过邮件系统
error_log('可以用邮件报告错误,让运维人员半夜起床干活',1 ,'liwenkai@phpxy.com');
//记录在指定的位置
error_log("我是一个错误哟", 3, "d:/test/my-errors.log");
?>

프로그램 실행 결과:

오류: [512] 값은 1 이하여야 합니다.
웹마스터에게 알림이 전송되었습니다

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

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

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

참고: error_log에 이메일을 보내는 것은 초보자에게 생소할 수 있으므로 지식을 습득할 필요는 없습니다.


error_reporting 보고 오류 유형

error_reporting은 오류 신고. php.ini에도 이러한 매개변수가 있습니다. 이 매개변수. PHP 엔진이 기록, 보고 및 표시하는 오류 유형을 결정합니다.

1. php.ini에서 error_reporting 매개변수를 설정합니다. error_reporting 매개변수가 0으로 설정된 경우. 전체 PHP 엔진의 오류는 표시, 출력 또는 기록되지 않습니다. 다음 장에서 설명할 로깅에는 기록되지 않습니다.

우리가 쓸 수 있는 모든 오류를 표시하려면 다음과 같이 작성하세요.

error_reporting = E_ALL

모든 오류를 표시하고 싶지만 제외 팁, 이 매개변수를 다음과 같이 작성할 수 있습니다.

error_reporting = E_ALL & ~ E_NOTICE

모든 오류를 표시하지만 프롬프트, 호환성 및 오류는 제외합니다. 미래의 호환성. 다음과 같이 작성할 수 있습니다:

error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED


2. php.ini 파일을 동작시킬 수 있는 권한이 없는 경우도 있는데, error_reporting을 제어하고 싶다면 어떻게 해야 할까요?

실행 중인 xxxx.php 파일 시작 부분에서 error_reporting() 함수를 사용하여 목표를 달성할 수 있습니다.

<?php
 //error handler function
 function customError($errno, $errstr)
 {
     echo "<b>Error:</b> [$errno] $errstr<br />";
     echo "Webmaster has been notified";
     error_log("Error: [$errno] $errstr",1,
         "someone@example.com","From: webmaster@example.com");
 }
 
 //set error handler
 set_error_handler("customError",E_USER_WARNING);
 
 //trigger error
 $test=2;
 if ($test>1)
 {
     trigger_error("Value must be 1 or below",E_USER_WARNING);
 }
 ?>

위 코드를 시도해보고 의도적으로 잘못된 코드를 작성해 볼 수도 있습니다. 지정된 오류가 현재 파일에 표시되는지 여부입니다.

[지식 포인트 확장 및 이해]:

@ 기호는 이전에 배운 한 줄입니다. 오류가 표시되지 않는 경우 @ 기호를 사용하지 않거나 덜 사용하십시오.


인스턴스

존재하지 않는 파일을 읽고 다음 PHP 코드로 구현 프로세스를 살펴보겠습니다.

<?php
//关闭了所有的错误显示
error_reporting(0);
//显示所有错误
//error_reporting(E_ALL);
//显示所有错误,但不显示提示
//error_reporting(E_ALL & ~ E_NOTICE);
?>



다음 섹션
<?php header("Content-type:text/html;charset=utf-8"); // 错误处理函数 function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr"; } // 设置错误处理函数 set_error_handler("customError"); // 触发错误 echo($test); //关闭了所有的错误显示 error_reporting(0); //显示所有错误 //error_reporting(E_ALL); //显示所有错误,但不显示提示 //error_reporting(E_ALL & ~ E_NOTICE); ?>
코스웨어
    없음
    错误消息类型      说明
     0发送至默认的error_log指定位置
     1 发送到指定的邮件位置
     3发送至指定的文件位置
<🎜> 오류 메시지 유형<🎜><🎜>
<🎜><🎜> 설명<🎜><🎜>
0 기본 error_log 지정된 위치로 보내기
1 지정된 이메일 위치로 보내기
3지정된 파일 위치로 보내기