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('error_alert'); function error_alert() { if(is_null($e = error_get_last()) === false) { set_error_handler('errorHandler'); if($e['type'] == 1){ trigger_error("fatal error", E_USER_ERROR); }elseif($e['type'] == 8){ trigger_error("notice", E_USER_NOTICE); }elseif($e['type'] == 2){ trigger_error("warning", E_USER_WARNING); }else{ trigger_error("other", E_USER_OTHER); } }else{ echo "no error"; } } set_error_handler('errorHandler'); 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't refer to $this } } function NonClassFunction($errno, $errstr, $errfile, $errline) { } // 三种方法如下: set_error_handler(‘NonClassFunction'); // 直接转到一个普通的函数 NonClassFunction set_error_handler(array(‘CallbackClass', ‘StaticFunction')); // 转到 CallbackClass 类下的静方法 StaticFunction $o =& new CallbackClass(); set_error_handler(array($o, ‘CallbackFunction')); // 转到类的构造函数,其实本质上跟下面的第四条一样。 . $o = new CallbackClass(); // The following may also prove useful class CallbackClass { function CallbackClass() { set_error_handler(array(&$this, ‘CallbackFunction')); // 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中文网!