PHP的错误机制总结

E_DEPRECATED

这个错误表示你用了一个旧版本的函数,而这个函数后期版本可能被禁用或者不维护了。

比如curl的CURLOPT_POSTFIELDS使用@FILENAME来上传文件的方法

// Deprecated: curl_setopt(): The usage of the @filename API for file uploading is deprecated. Please use the CURLFile class instead in /tmp/php/index.php on line 42
$ch = curl_init("http://www.remotesite.com/upload.php");
curl_setopt($ch, CURLOPT_POSTFIELDS, array('fileupload' => '@'. "test"));

set_exception_handler

设置一个用户定义的异常处理函数

<?php
function exception_handler($exception) {
  echo "Uncaught exception: " , $exception->getMessage(), "n";
}

set_exception_handler('exception_handler');

throw new Exception('Uncaught Exception');
echo "Not Executedn";
?>

E_RECOVERABLE_ERROR

这个级别其实是ERROR级别的,但是它是期望被捕获的,如果没有被错误处理捕获,表现和E_ERROR是一样的。

经常出现在形参定义了类型,但调用的时候传入了错误类型。它的错误提醒也比E_ERROR的fatal
error前面多了一个Catachable的字样。

//Catchable fatal error: Argument 1 passed to testCall() must be an instance of A, instance of B given, called in /tmp/php/index.php on line 37 and defined in /tmp/php/index.php on line 33
class A {
}

class B {
}

function testCall(A $a) {
}

$b = new B();
testCall($b);

error_reporting

int error_reporting ([ int $level ] )

澳门新葡亰娱乐在线,设置应该报告何种 PHP 错误

// 关闭所有PHP错误报告,会返回新的错误报告级别
error_reporting(0);

// Report simple running errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);

如果不带参数就返回当前错误报告级别

特别说明:文章的PHP版本使用5.5.32

register_shutdown_function

这个函数是在脚本结束之后运行的函数(不管是正常结束还是通过exit、发生错误结束)

E_STRICT

这个错误是PHP5之后引入的,你的代码可以运行,但是不是PHP建议的写法。

比如在函数形参传递++符号

// Strict Standards: Only variables should be passed by reference in /tmp/php/index.php on line 17
function change (&$var) {
  $var += 10;
}

$var = 1;
change(++$var);
// E_STRICT

4 E_PARSE (integer)

编译时语法解析错误。
解析错误仅仅由分析器产生。
register_shutdown_function不能捕获到本文件内发生的这个错误

E_COMPILE_ERROR, E_COMPILE_WARNING

这两个错误是由PHP引擎产生的,在编译过程中发生。

错误处理相关函数

E_CORE_ERROR, E_CORE_WARNING

这两个错误是由PHP的引擎产生的,在PHP初始化过程中发生。

8192 E_DEPRECATED (integer)

运行时通知。
启用后将会对在未来版本中可能无法正常工作的代码给出警告。

E_ALL

E_STRICT出外的所有错误和警告信息。

error_get_last

获取最后发生的错误,register_shutdown_function()常常用到

array error_get_last ( void )

返回结果

Array
(
    [type] => 8
    [message] => Undefined variable: a
    [file] => C:WWWindex.php
    [line] => 2
)

E_PARSE

这个错误是编译时候发生的,在编译期发现语法错误,不能进行语法分析。

比如下面的z没有设置为变量。

// Parse error: syntax error, unexpected '=' in /tmp/php/index.php on line 20
z=1; // E_PARSE

16 E_CORE_ERROR (integer)

在PHP初始化启动过程中发生的致命错误。
该错误类似 E_ERROR,但是是由PHP引擎核心产生的。

PHP的错误级别

首先需要了解php有哪些错误。截至到php5.5,一共有16个错误级别

注意:尝试下面的代码的时候请确保打开error_log:

error_reporting(E_ALL);
ini_set('display_errors', 'On');

error_handler

handler ( int $errorLevel , string $errorMessage [, string $errfile [, int $errline [, array $errcontext ]]] )

errcontext, 是一个指向错误发生时活动符号表的 array。
也就是说,errcontext 会包含错误触发处作用域内所有变量的数组。
用户的错误处理程序不应该修改错误上下文(context)。

PHP的错误机制也是非常复杂的,做了几年php,也没有仔细总结过,现在就补上这一课。

1 E_ERROR (integer)

致命的运行时错误。这类错误一般是不可恢复的情况,例如内存分配导致的问题。
导致脚本终止不再继续运行
例子:调用一个未定义的函数,存在没有捕获的异常

php-fpm中的配置

error_log = /var/log/php-fpm/error.log // php-fpm自身的日志
log_level = notice // php-fpm自身的日志记录级别
php_flag[display_errors] = off // 覆盖php.ini中的某个配置变量,可被程序中的ini_set覆盖
php_value[display_errors] = off // 同php_flag
php_admin_value[error_log] = /tmp/www-error.log // 覆盖php.ini中的某个配置变量,不可被程序中的ini_set覆盖
php_admin_flag[log_errors] = on // 同php_admin_value
catch_workers_output = yes // 是否抓取fpmworker的输出
request_slowlog_timeout = 0 // 慢日志时长
slowlog = /var/log/php-fpm/www-slow.log // 慢日志记录

php-fpm的配置中也有一个error_log配置,这个很经常会和php.ini中的error_log配置弄混。但他们记录的东西是不一样的,php-fpm的error_log只记录php-fpm本身的日志,比如fpm启动,关闭。

而php.ini中的error_log是记录php程序本身的错误日志。

那么在php-fpm中要覆盖php.ini中的error_log配置,就需要使用到下面几个函数:

  • php_flag
  • php_value
  • php_admin_flag
  • php_admin_value

这四个函数admin的两个函数说明这个变量设置完之后,不能在代码中使用ini_set把这个变量重新赋值了。而php_flag/value就仍然以php代码中的ini_set为准。

slowlog是fpm记录的,可以使用request_slowlog_timeout设置判断慢日志的时长。

2048 E_STRICT (integer)

启用 PHP 对代码的修改建议,以确保代码具有最佳的互操作性和向前兼容性。

E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE, E_USER_DEPRECATED,

这些错误都是用户制造的,使用trigger_error,这里就相当于一个口子给用户触发出各种错误类型。这个是一个很好逃避try
catch异常的方式。

trigger_error("Cannot divide by zero", E_USER_ERROR);
// E_USER_ERROR
// E_USER_WARING
// E_USER_NOTICE
// E_USER_DEPRECATED

错误类型

因为错误类型整型值的巧妙设定,可以采用按位运算符

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图