>백엔드 개발 >PHP 튜토리얼 >PHP의 오류 설정 핸들러 함수 사용법 요약

PHP의 오류 설정 핸들러 함수 사용법 요약

高洛峰
高洛峰원래의
2017-01-06 14:09:491197검색

set_error_handler() 함수는 사용자 정의 오류 처리 함수를 설정합니다. 이 함수는 런타임 중에 사용자 고유의 오류 처리 방법을 만드는 데 사용됩니다. 이 함수는 이전 오류 처리기를 반환하거나 실패 시 null을 반환합니다.

아래의 몇 가지 예를 살펴보세요.

set_error_handler()

PHP는 4.1.0부터 사용자 정의 오류 처리 핸들의 set_error_handler() 함수를 제공했지만 이를 아는 스크립트 작성자는 거의 없습니다. set_error_handler 함수는 오류 경로가 유출되는 것을 방지할 수 있으며, 물론 다른 기능도 있습니다.

1. 오류를 차단하는 데 사용할 수 있습니다. 오류가 발생하면 일부 정보가 사용자에게 노출되며, 이는 해커가 웹사이트를 공격하는 도구가 될 가능성이 매우 높습니다. 둘째, 사용자가 자신의 레벨이 매우 낮다고 느끼게 만듭니다.

2. 오류 정보를 적고 제작 환경의 문제점을 적시에 발견할 수 있습니다.

3. 오류가 발생하면 더 나은 사용자 경험을 제공하기 위해 미리 정의된 오류 페이지로 이동할 수 있습니다.

4. 때로는 프로덕션 환경에서 디버깅해야 하지만 이를 사용하는 사용자에게 영향을 주고 싶지 않은 경우도 있습니다.

5. . . .

set_error_handler를 사용하는 방법은 다음과 같습니다.

view sourceprint?1 string set_error_handler ( callback error_handler [, int error_types])

error_reporting()을 사용하여 표시되는 오류 메시지는 오류 메시지, 오류 파일의 절대 주소, 그리고 오류가 발생한 줄 번호입니다. 실제로 또 다른 유형의 오류가 있습니다. 배열( [유형] => 1 [메시지] => 정의되지 않은 메소드 호출 SomeClass::somemedthod() [파일] => /home/zhangy/www/aaaa/stasdf.php [line] => 67 ), 페이지의 절대 경로를 다른 사람에게 노출하지 않는 것이 가장 좋습니다. 그렇지 않으면 일부 사람들에게 불평할 기회를 주기 때문에 많은 사람들이 ini_set("display_errors",0); 을 사용하여 직접 차단할 것입니다. 오류 메시지. 정보를 읽고 싶다면 어떻게 해야 할까요? 확인할 때마다 코드를 변경해야 하나요, 아니면 아파치 구성을 변경하고 다시 시작해야 하나요?

php 함수register_shutdown_function도 이 문제를 해결할 수 있습니다

사용법은 다음과 같습니다:

int Register_shutdown_function ( string $func )

개인적으로는 오류 보고 기능을 직접 정의하면 최소한 세 가지 장점이 있다고 생각합니다.

1. 표시되지 않아 더욱 안전합니다

2. 오류 메시지가 나타나더라도 사용자가 치명적인 오류 등을 볼 수 없도록 오류 메시지를 처리할 수 있습니다. 사용자 경험이 더 좋아야 합니다

3. 프로젝트가 시작된 후에도 사용자가 문제를 해결하도록 도와야 하는 경우가 있습니다. 이때 코드를 수정하는 것은 불가피하지만 우리도 마찬가지입니다. 오류 메시지를 보고하며 사용자가 볼 수 없습니다. 이때 set_error_handler와 같은 함수를 사용하는 것이 매우 좋습니다.

작은 테스트를 했습니다

이제 사용자 정의 오류 처리를 사용하여 실제 경로를 필터링합니다. 방문자가 관리자인지 여부를 결정하는 데 사용하는 변수 $admin이 있다고 가정합니다. (이 결정은 IP 또는 로그인한 사용자 ID로 이루어질 수 있습니다.)

//admin은 방문자의 신원입니다. 관리자 결정, true는 관리자입니다.
//사용자 정의 오류 처리 함수에는 $errno, $errstr, $errfile, $errline 네 가지 입력 변수가 있어야 합니다. 그렇지 않으면 유효하지 않습니다.

이런 식으로 오류 처리 기능을 사용자 정의했는데 오류 처리를 이 사용자 정의 기능에 어떻게 넘겨주나요?
<?php
 error_reporting(0);
register_shutdown_function(&#39;error_alert&#39;);
 function error_alert()
 {
 if(is_null($e = error_get_last()) === false)
 {
 set_error_handler(&#39;errorHandler&#39;);
 if($e[&#39;type&#39;] == 1){
 trigger_error("fatal error", E_USER_ERROR);
 }elseif($e[&#39;type&#39;] == 8){
 trigger_error("notice", E_USER_NOTICE);
 }elseif($e[&#39;type&#39;] == 2){
 trigger_error("warning", E_USER_WARNING);
 }else{
 trigger_error("other", E_USER_OTHER);
 }
 }else{
 echo "no error";
 }
 }
 set_error_handler(&#39;errorHandler&#39;);
function errorHandler($errno, $errstr, $errfile, $errline,$errcontext)
 {
 switch ($errno) {
 case E_USER_ERROR:
 echo "<b>My ERROR</b> [$errno] $errstr<br />n";
 echo " Fatal error on line $errline in file $errfile";
 echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />n";
 break;
 case E_USER_WARNING:
 echo "<b>My WARNING</b> [$errno] $errstr<br />n";
 echo " warning on line $errline in file $errfile";
 echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />n";
 break;
 case E_USER_NOTICE:
 echo "<b>My NOTICE</b> [$errno] $errstr<br />n";
 echo " notice on line $errline in file $errfile";
 echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />n";
 break;
 default:
 echo "Unknown error type: [$errno] $errstr<br />n";
 echo " warning on line $errline in file $errfile";
 echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />n";
 break;
 }
 return true;
 }
class SomeClass {
 public function someMethod() {
 }
 }
SomeClass::someMedthod();
$a="asdf";
 foreach($a as $d){
 echo $d;
 }
 ?>


너무나 쉽기 때문에 보안과 디버깅 편의성의 모순을 잘 해결할 수 있습니다. 또한 웹사이트 스타일에 맞게 오류 메시지를 더욱 아름답게 만드는 방법도 생각할 수 있습니다.


위의 예에서는 오류 메시지를 끄고 자체 기능을 사용하여 오류를 처리했습니다. 위 페이지에서는 errorHandler를 사용하여 오류 메시지를 보고할 수 있습니다. 그리고 처리.

function my_error_handler($errno,$errstr,$errfile,$errline) 
{ 
  //如果不是管理员就过滤实际路径 
  if(!admin) 
  { 
    $errfile=str_replace(getcwd(),"",$errfile); 
    $errstr=str_replace(getcwd(),"",$errstr); 
  } 
  switch($errno) 
  { 
    case E_ERROR: 
    echo "ERROR: [ID $errno] $errstr (Line: $errline of $errfile) n"; 
    echo "程序已经停止运行,请联系管理员。"; 
    //遇到Error级错误时退出脚本 
    exit; 
    break; 
    case E_WARNING: 
    echo "WARNING: [ID $errno] $errstr (Line: $errline of $errfile) n"; 
    break; 
    default: 
    //不显示Notice级的错误 
    break; 
  } 
}

알겠습니다. 요약하면 set_error_handler의 세 가지 용도는 다음과 같습니다.

// 应用到类 
set_error_handler(array(&$this,"appError")); 
//示例的做法 
set_error_handler("my_error_handler");

PHP 코드

잠시 시간을 내어 소개하겠습니다. PHP set_error_handler() 함수의 정의와 사용법을 소개합니다.


set_error_handler() 함수는 사용자 정의 오류 처리 함수를 설정합니다.

런타임 중 사용자가 직접 오류 처리 방법을 만들 때 사용하는 함수입니다.

class CallbackClass {
 function CallbackFunction() {
 // refers to $this
 }
  
function StaticFunction() {
 // doesn&#39;t refer to $this
 }
 }
  
function NonClassFunction($errno, $errstr, $errfile, $errline) {
 }
 // 三种方法如下:
  
 set_error_handler(‘NonClassFunction&#39;); // 直接转到一个普通的函数 NonClassFunction
 set_error_handler(array(‘CallbackClass&#39;, ‘StaticFunction&#39;)); // 转到 CallbackClass 类下的静方法 StaticFunction
 $o =& new CallbackClass();
 set_error_handler(array($o, ‘CallbackFunction&#39;)); // 转到类的构造函数,其实本质上跟下面的第四条一样。
. $o = new CallbackClass();
// The following may also prove useful
class CallbackClass {
 function CallbackClass() {
 set_error_handler(array(&$this, ‘CallbackFunction&#39;)); // the & is important
 }
function CallbackFunction() {
 // refers to $this
 }
 }
이 함수는 이전 오류 핸들러를 반환하거나 실패 시 null을 반환합니다.

구문

set_error_handler(error_function,error_types)

매개변수 설명

error_function 필수입니다. 오류가 발생할 때 실행할 함수를 지정합니다.

error_types는 선택사항입니다. 사용자 정의 오류가 표시되는 오류 보고 수준을 지정합니다. 기본값은 "E_ALL"입니다.

팁 및 참고 사항

팁: 이 함수를 사용하면 표준 PHP 오류 처리 함수가 완전히 우회됩니다. 필요한 경우 사용자 정의 오류 처리기를 종료해야 합니다(die()). 스크립트.

참고: 스크립트가 실행되기 전에 오류가 발생하면 해당 시점에는 사용자 정의 프로그램이 등록되지 않았기 때문에 사용자 정의 오류 처리기가 사용되지 않습니다.


<?php
//error handler function
function customError($errno, $errstr, $errfile, $errline)
 { 
 echo "<b>Custom error:</b> [$errno] $errstr<br />";
 echo " Error on line $errline in $errfile<br />";
 echo "Ending Script";
 die();
 }
//set error handler
set_error_handler("customError");
$test=2;
//trigger error
if ($test>1)
 {
 trigger_error("A custom error has been triggered");
 }
?>

输出:

Custom error: [1024] A custom error has been triggered
Error on line 19 in C:/webfolder/test.php
Ending Script

更多PHP中set error handler函数用法小结相关文章请关注PHP中文网!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.