PHP错误捕获

PHP错误类型说明

常量 说明
1 E_ERROR 致命的运行时错误。这类错误一般是不可恢复的情况,例如内存分配导致的问题。后果是导致脚本终止不再继续运行。
2 E_WARNING 运行时警告 (非致命错误)。仅给出提示信息,但是脚本不会终止运行。
4 E_PARSE 编译时语法解析错误。解析错误仅仅由分析器产生。
8 E_NOTICE 运行时通知。表示脚本遇到可能会表现为错误的情况,但是在可以正常运行的脚本里面也可能会有类似的通知。
16 E_CORE_ERROR 在PHP初始化启动过程中发生的致命错误。该错误类似 E_ERROR,但是是由PHP引擎核心产生的。
32 E_CORE_WARNING PHP初始化启动过程中发生的警告 (非致命错误) 。类似 E_WARNING,但是是由PHP引擎核心产生的。
64 E_COMPILE_ERROR 致命编译时错误。类似E_ERROR, 但是是由Zend脚本引擎产生的。
128 E_COMPILE_WARNING 编译时警告 (非致命错误)。类似 E_WARNING,但是是由Zend脚本引擎产生的。
256 E_USER_ERROR 用户产生的错误信息。类似 E_ERROR, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的。
512 E_USER_WARNING 用户产生的警告信息。类似 E_WARNING, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的。
1024 E_USER_NOTICE 用户产生的通知信息。类似 E_NOTICE, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的。
2048 E_STRICT 启用 PHP 对代码的修改建议,以确保代码具有最佳的互操作性和向前兼容性。
4096 E_RECOVERABLE_ERROR 可被捕捉的致命错误。 它表示发生了一个可能非常危险的错误,但是还没有导致PHP引擎处于不稳定的状态。 如果该错误没有被用户自定义句柄捕获 (参见 set_error_handler()),将成为一个 E_ERROR 从而脚本会终止运行。
8192 E_DEPRECATED 运行时通知。启用后将会对在未来版本中可能无法正常工作的代码给出警告。
16384 E_USER_DEPRECATED 用户产少的警告信息。 类似 E_DEPRECATED, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的。
30719 E_ALL E_STRICT出外的所有错误和警告信息。

开启错误提示

  1. 在php.ini中设置

    error_reporting = E_ALL # 错误显示级别
    display_errors = Off # 是否允许在PHP文件中显示错误
    log_errors = On # 开启文件日志
    error_log = "c:/wamp/logs/php_error.log" # 日志文件保存路径
    

    通过php.ini文件设置了display_errors = Off后,无法在php文件中通过ini_set("display_errors", 1)进行开启。 而且该设置将屏蔽编译、Zend脚本引擎、脚本运行时、以及通过E_USER..类的所有错误。

  2. 在脚本文件中设置

    ini_set("display_errors", 0)
    

    前面说了,该开关仅在php.ini中设置了display_errors = On才有效,该配置只能控制脚本运行时以及、E_USER...类错误。 类似于E_PARSEE_CORE_ERROR等编译与Zend脚本引擎,此方法无法控制。

终上所述,大体可以概括为错误提示来自于四个方面,分别为:PHP文件编译时、Zend脚本引擎、脚本运行时、用户自定义.
PHP文件编译与Zend脚本引擎产的错误只能通过php.ini中进行设置捕获。

错误捕获

  1. 脚本运行错误捕获除了可以通过php.ini设置日志文件进行捕获,还可以通过error_get_last函数进行致命错误捕获. void register_shutdown_function ( callable $callback [, mixed $parameter [, mixed $... ]] ) function shutdown() { print_r(error_get_last()); } register_shutdown_function('shutdown');

register_shutdown_function函数在程序执行退出时调用,我们可以在此调用error_get_last()捕获致命错误;
error_get_last()不能捕获PHP文件编译与Zend脚本引擎产的错误,如E_PARSEE_CORE_ERROR
error_get_last()不受php.ini及php文件中的ini_set("display_errors", 0)error_reporting(0)影响,只要是脚本执行错误无论错误提示是否打开,以及错误提示级别如何,它都能捕获错误。

  1. 在程序运行过程中,想触发一个自定义错误,当然使用普通的输入输出很容易办到,但是通过set_error_handler让错误变得更容易追踪。 function exception_error_handler($errno, $errstr, $errfile, $errline ) { throw new ErrorException($errstr, 0, $errno, $errfile, $errline); } set_error_handler("exception_error_handler"); $test=2; // 触发错误 if ($test>1) { trigger_error("A custom error has been triggered"); }