>  기사  >  백엔드 개발  >  PHP의 set error handler() 함수 사용법 요약

PHP의 set error handler() 함수 사용법 요약

怪我咯
怪我咯원래의
2017-07-06 10:38:291097검색

set_error_handler() 함수는 사용자 정의 오류 처리 함수를 설정합니다. 이 함수는 런타임 중에 사용자 고유의 오류 처리 방법을 만드는 데 사용됩니다. 이 함수는 이전 오류 처리기를 반환하거나, 실패할 경우 null을 반환합니다. 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에는 이 문제를 해결하기 위한 set_error_handler 함수가 있습니다


사용 방법은 다음과 같습니다. 함수 Register_shutdown _function도 이 질문을 해결할 수 있습니다.


사용 방법은 다음과 같습니다.


intregister_shutdown_function(string $func)

개인적으로는 오류 함수를 직접 정의하면 적어도 세 가지 장점이 있다고 생각합니다.

1. 파일의 절대 경로가 표시되지 않아 더욱 안전합니다.

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

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

작은 테스트를 했습니다

<?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;
 }
 ?>

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


//admin은 관리자의 신원 확인이고, true는 관리자 .

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

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(array(&$this,"appError")); 
//示例的做法 
set_error_handler("my_error_handler");

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


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

좋아요, 요약하면 set_error_handler의 세 가지 사용법은 다음과 같습니다.


Php code

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
 }
 }

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

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

런타임 중 사용자 고유의 오류 처리 방법을 생성하는 데 사용되는 함수입니다.

이 함수는 이전 오류 처리기를 반환하거나, 실패하면 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으로 문의하세요.