목차
set_error_handler()
백엔드 개발 PHP 튜토리얼 PHP set_error_handler()函数的使用_PHP教程

PHP set_error_handler()函数的使用_PHP教程

Jul 13, 2016 am 10:34 AM
set_error_handler 오류 신고

我们写程序,难免会有问题(是经常会遇到问题 ),而PHP遇到错误时,就会给出出错脚本的位置、行数和原因。有很多人说,这并没有什么大不了。确实,在调试程序阶段,这确实是没啥的,而且我认为给出错误路径是必要的。

但泄露了实际路径的后果是不堪设想的,对于某些入侵者,这个信息可是非常重要,而事实上现在有很多的服务器都存在这个问题。有些网管干脆把PHP配置文件中的display_errors设置为Off来解决(貌似我们就是这样做的),但本人认为这个方法过于消极。

有些时候,我们的确需要PHP返回错误的信息以便调试。而且在出错时也可能需要给用户一个交待,甚至导航到另一页面。

那么,有啥解决办法呢?

set_error_handler()

PHP从4.1.0开始提供了自定义错误处理句柄的功能函数set_error_handler(),但很少数脚本编写者知道。set_error_handler这个函数可以很好地防止错误路径泄露,当然还有其它更多的作用。

  1. 可以用来屏蔽错误。 出现错误一来会把一些信息暴漏给用户,极有可能成为黑客攻击你网站的工具。 二来让用户觉得你的水平很挫。
  2. 可以记下错误的信息, 及时发现一些生产环境的出现的问题。
  3. 可以做相应的处理, 出错的时候可以显示跳转到预先定义好的出错页面,提供更好的用户体验。 
  4. 可以作为调试工具, 一些时候必须在生产环境调试一些东西, 但又不想影响正在使用的用户。
  5. 。。。。

set_error_handler的使用方法如下:

string set_error_handler ( callback error_handler [, int error_types])
로그인 후 복사

现在我们就用自定义的错误处理把实际路径过滤掉。假设有一个变量$admin,我们是用来判断访问者是否是管理员的(可以通过IP或者登录的用户id来做这个判断)

//admin为管理员的身份判定,true为管理员。  
//自定义的错误处理函数一定要有这4个输入变量$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");  
로그인 후 복사

so easy,这样,就可以很好地解决安全和调试方便的矛盾了。而且你还可以花点心思,使错误提示更加美观以配合网站的风格。

原作者给出了两点需要注意的地方,我也放出来吧,希望引起广大同胞们的注意:

  1. E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、 E_COMPILE_ERROR、E_COMPILE_WARNING是不会被这个句柄处理的,也就是会用最原始的方式显示出来。不过出现这些错误都是编 译或PHP内核出错,在通常情况下不会发生。
  2. 使用set_error_handler()后,error_reporting ()将会失效。也就是所有的错误(除上述的错误)都会交给自定义的函数处理。

最后,原作者又给出了一个示例(真是个认真负责的好人哈。)

//先定义一个函数,也可以定义在其他的文件中,再用require()调用  
function myErrorHandler($errno, $errstr, $errfile, $errline)  
{  
     //为了安全起见,不暴露出真实物理路径,下面两行过滤实际路径  
    $errfile=str_replace(getcwd(),"",$errfile);  
    $errstr=str_replace(getcwd(),"",$errstr);  
  
    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";  
        echo "Aborting...<br />\n";  
        exit(1);  
        break;  
  
    case E_USER_WARNING:  
        echo "<b>My WARNING</b> [$errno] $errstr<br />\n";  
        break;  
  
    case E_USER_NOTICE:  
        echo "<b>My NOTICE</b> [$errno] $errstr<br />\n";  
        break;  
  
    default:  
        echo "Unknown error type: [$errno] $errstr<br />\n";  
        break;  
    }  
  
    /* Don't execute PHP internal error handler */  
    return true;  
}  
  
//下面开始连接MYSQL服务器,我们故意指定MYSQL端口为3333,实际为3306。  
$link_id=@mysql_pconnect("localhost:3333","root","password");  
set_error_handler(myErrorHandler);  
if (!$link_id) {  
    trigger_error("出错了", E_USER_ERROR);  
}  
로그인 후 복사

好了,总结一下,下面是 set_error_handler 三种用法:

class CallbackClass {  
   function CallbackFunction() {  
       // refers to $this  
   }  
  
   function StaticFunction() {  
       // doesn't refer to $this  
   }  
}  
  
function NonClassFunction($errno, $errstr, $errfile, $errline) {  
}  
  
// 三种方法如下:  
  
1: set_error_handler('NonClassFunction');  // 直接转到一个普通的函数 NonClassFunction  
  
2: set_error_handler(array('CallbackClass', 'StaticFunction')); // 转到 CallbackClass 类下的静方法 StaticFunction  
  
3: $o =& new CallbackClass();  
    set_error_handler(array($o, 'CallbackFunction'));  // 转到类的构造函数,其实本质上跟下面的第四条一样。  
  
4. $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  
   }  
}  
로그인 후 복사

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/752326.htmlTechArticle我们写程序,难免会有问题(是经常会遇到问题 ),而PHP遇到错误时,就会给出出错脚本的位置、行数和原因。有很多人说,这并没有什...
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

열 개수가 행 1의 값 개수와 일치하지 않습니다. - MySQL 오류 해결 방법: 열 번호가 값과 일치하지 않습니다. 열 개수가 행 1의 값 개수와 일치하지 않습니다. - MySQL 오류 해결 방법: 열 번호가 값과 일치하지 않습니다. Oct 05, 2023 am 11:40 AM

MySQL 오류 해결 방법: 열 수가 값과 일치하지 않습니다. 데이터 작업에 MySQL 데이터베이스를 사용할 때 때때로 "Columncountdoesn'tmatchvaluecountatrow1"이라는 오류 메시지가 표시됩니다. 열 개수가 일치하는 값 개수와 일치하지 않습니다. 이 오류는 일반적으로 데이터를 삽입할 때 지정된 열 수가 삽입된 값의 수와 일치하지 않을 때 발생합니다. 이 문서에서는 특정 해결 방법을 설명하고 코드 예제를 제공합니다. 조사하다

잘못된 테이블 정의; 자동 열은 하나만 있을 수 있으며 이는 키로 정의되어야 합니다. - MySQL 오류 해결 방법: 잘못된 테이블 정의는 하나의 자동 열만 있을 수 있으며 키로 정의되어야 합니다. 잘못된 테이블 정의; 자동 열은 하나만 있을 수 있으며 이는 키로 정의되어야 합니다. - MySQL 오류 해결 방법: 잘못된 테이블 정의는 하나의 자동 열만 있을 수 있으며 키로 정의되어야 합니다. Oct 05, 2023 am 11:05 AM

MySQL 오류 해결 방법: 잘못된 테이블 정의는 하나의 자동 열만 있을 수 있으며 이를 키로 정의해야 합니다. 최근에는 MySQL 데이터베이스가 점점 더 널리 사용되고 있습니다. , 우리는 종종 다양한 오류 보고서를 접하게 됩니다. 그 중 일반적인 오류는 "잘못된 테이블 정의입니다. 자동 열은 하나만 있을 수 있으며 키로 정의해야 합니다."입니다. 이 오류는 일반적으로 테이블을 생성할 때 발생하는데, 이는 초보자에게 골칫거리일 수 있습니다. 이 문서에서는 이 오류의 원인에 대한 자세한 분석을 제공하고 구체적인 정보를 제공합니다.

MySQL 오류 10060 MySQL 오류 10060 Sep 12, 2023 am 11:00 AM

mysql 오류 10060에 대한 해결 방법에는 MySQL 서버가 정상적으로 실행되고 있는지 확인, 네트워크 연결 확인, 방화벽 설정 확인, MySQL 서버 구성 확인, MySQL 사용자 권한 확인, 네트워크 구성 확인, 최대 연결 수 제한 확인이 포함됩니다. MySQL 서버의 이름을 지정하고 호스트 대신 IP 주소를 사용합니다. MySQL 서버 등을 다시 시작합니다. 자세한 소개: 1. MySQL 서버가 정상적으로 실행되고 있는지 확인하십시오. 먼저 MySQL 서버가 실행 중이고 올바른 포트를 수신하는지 확인하십시오.

원인 분석: HTTP 요청 오류 504 게이트웨이 시간 초과 원인 분석: HTTP 요청 오류 504 게이트웨이 시간 초과 Feb 19, 2024 pm 05:12 PM

http 요청 오류의 원인에 대한 간략한 소개: 504GatewayTimeout: 네트워크 통신 중에 클라이언트는 HTTP 요청을 보내 서버와 상호 작용합니다. 그러나 때때로 요청을 보내는 과정에서 일부 오류 메시지가 나타날 수 있습니다. 그 중 하나는 504GatewayTimeout 오류입니다. 이 기사에서는 이 오류의 원인과 해결 방법을 살펴보겠습니다. 504GatewayTimeout 오류란 무엇입니까? 게이트웨이Timeo

해결 방법: HTTP 요청 처리 시 소켓 오류 해결 방법: HTTP 요청 처리 시 소켓 오류 Feb 25, 2024 pm 09:24 PM

http 요청 오류: SocketError에 대한 해결 방법 네트워크 요청을 할 때 흔히 발생하는 다양한 오류 중 하나는 SocketError입니다. 이 오류는 애플리케이션이 서버와 연결을 설정할 수 없을 때 발생합니다. 이 기사에서는 SocketError의 몇 가지 일반적인 원인과 해결 방법에 대해 설명합니다. 먼저 소켓이 무엇인지 이해해야 합니다. 소켓은 애플리케이션이 다음을 수행할 수 있도록 하는 통신 프로토콜입니다.

pyqt5 설치 오류를 신속하게 해결하기 위한 단계별 가이드 pyqt5 설치 오류를 신속하게 해결하기 위한 단계별 가이드 Jan 19, 2024 am 09:32 AM

Python을 배우고 GUI 애플리케이션을 개발하고 싶다면 PyQt5가 매우 좋은 선택입니다. Python에서 PyQt 라이브러리의 바인딩된 버전으로, Qt 그래픽 라이브러리를 호출하고 개발하는 것이 매우 편리합니다. 그러나 때로는 PyQt5를 설치할 때 몇 가지 문제가 발생할 수 있습니다. 이 가이드에서는 설치 오류 문제를 신속하게 해결하기 위한 몇 가지 단계를 제공하고 특정 코드 예제도 첨부합니다. Python 버전이 올바른지 확인하십시오. PyQt5는 Python 기반 라이브러리이므로 먼저

'where 절'의 알 수 없는 열 'column_name' - MySQL 오류 해결 방법: where 절의 알 수 없는 열 'where 절'의 알 수 없는 열 'column_name' - MySQL 오류 해결 방법: where 절의 알 수 없는 열 Oct 05, 2023 am 11:15 AM

Unknowncolumn'column_name'in'whereclause' - MySQL 오류 해결 방법: where 절의 알 수 없는 열, 특정 코드 예제가 필요합니다. MySQL은 SQL(구조적 쿼리 언어) 사용을 지원하는 널리 사용되는 관계형 데이터베이스 관리 시스템입니다. 데이터의 저장, 관리 및 검색. 그러나 MySQL을 사용하여 쿼리할 때 흔히 발생하는 오류 중 하나는 Unkno입니다.

'error_keyword' 근처의 잘못된 구문 - MySQL 오류 해결 방법: 구문 오류 'error_keyword' 근처의 잘못된 구문 - MySQL 오류 해결 방법: 구문 오류 Oct 05, 2023 pm 04:24 PM

오류는 개발자가 MySQL 쿼리 문을 작성할 때 자주 직면하는 문제 중 하나입니다. 일반적인 오류 중 하나는 "'error_keyword' 근처의 잘못된 구문"입니다('error_keyword' 근처의 구문 오류). 이 오류 메시지는 매우 일반적이며 MySQL 쿼리 문에 구문 오류가 있음을 의미합니다. 이 기사에서는 이 문제를 해결하는 방법을 자세히 설명하고 몇 가지 구체적인 코드 예제를 제공합니다. 먼저 살펴 보겠습니다.

See all articles