PHP的错误机制总结

 百家乐-前端     |      2020-01-18 00:36

PHP的错误机制也是极其复杂的,做了几年php,也从未留心总计过,以往就补上那少年老成课。

特意表明:小说的PHP版本接纳5.5.32

PHP的失实等级

第后生可畏要求精晓php有啥样不当。结束到php5.5,大器晚成共有十四个错误级别

注意:尝试上边包车型大巴代码的时候请确定保证展开error_log:

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

E_ERROR

这种指鹿为马是致命错误,会在页面展现Fatal Error, 当现身这种不当的时候,程序就不能够继续试行下去了

不当示例:

// Fatal error: Call to undefined function hpinfo() in /tmp/php/index.php on line 5
hpinfo();  //E_ERROR

小心,假若有未被破获的老大,也是会接触这几个级其他。

// Fatal error: Uncaught exception 'Exception' with message 'test exception' in /tmp/php/index.php:5 Stack trace: #0 {main} thrown in /tmp/php/index.php on line 5
throw new Exception("test exception");

E_WARNING

这种指鹿为马只是警戒,不会终止脚本,程序还可能会三番九回打开,呈现的错误音信是Warning。比方include多个不设有的公文。

//Warning: include(a.php): failed to open stream: No such file or directory in /tmp/php/index.php on line 7
//Warning: include(): Failed opening 'a.php' for inclusion (include_path='.:/usr/share/pear:/usr/share/php') in /tmp/php/index.php on line 7
include("a.php"); //E_WARNING

E_NOTICE

这种不当程度更加的微微一些,提醒您那么些地方不应犹如此写。那一个也是运营时不当,那几个荒谬的代码大概在别的地点还没难点,只是在脚下上下文情状下冒出了难点。

举个例子$b变量不设有,大家把它赋值给此外三个变量

//Notice: Undefined variable: b in /tmp/php/index.php on line 9
$a = $b; //E_NOTICE

E_PARSE

这么些指鹿为马是编写翻译时候发出的,在编写翻译期发现语法错误,不能够打开语法解析。

比如下边包车型大巴z未有设置为变量。

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

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

E_RECOVERABLE_ERROR

那么些品级其实是EPRADOROCRUISER级其他,然而它是愿意被抓获的,若无被错误管理捕获,展现和E_ETucsonRO凯雷德是相仿的。

平常出今后形参定义了品种,但调用的时候传出了错误类型。它的失实提示也比E_E揽胜RO途乐的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);

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"));

E_CORE_ERROR, E_CORE_WARNING

那多个谬误是由PHP的蒸内燃机产生的,在PHP早先化进度中发生。

E_COMPILE_ERROR, E_COMPILE_WARNING

那四个错误是由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

E_ALL

E_STENVISIONICT出外的具备错误和警戒音讯。

谬误决定

php中有好些个架商谈参数是足以调节不当,以至错误的日志突显的。第一步,大家供给精晓的是php中的有关错误的配备有怎么着?

作者们依据php+php-fpm的模子来讲,会听得多了自然能详细说出来php错误展现的骨子里是有多个构造文件,三个是php自己的安顿文件php.ini,其余贰个是php-fpm的安排文件,php-fpm.conf。

php.ini中的配置

error_reporting = E_ALL  // 报告错误级别,什么级别的
error_log = /tmp/php_errors.log // php中的错误显示的日志位置
display_errors = On // 是否把错误展示在输出上,这个输出可能是页面,也可能是stdout
display_startup_errors = On // 是否把启动过程的错误信息显示在页面上,记得上面说的有几个Core类型的错误是启动时候发生的,这个就是控制这些错误是否显示页面的。
log_errors = On // 是否要记录错误日志
log_errors_max_len = 1024 // 错误日志的最大长度
ignore_repeated_errors = Off // 是否忽略重复的错误
track_errors = Off // 是否使用全局变量$php_errormsg来记录最后一个错误
xmlrpc_errors = 0 //是否使用XML-RPC的错误信息格式记录错误
xmlrpc_error_number = 0 // 用作 XML-RPC faultCode 元素的值。
html_errors = On  // 是否把输出中的函数等信息变为HTML链接
docref_root = http://manual/en/ // 如果html_errors开启了,这个链接的根路径是什么
fastcgi.logging = 0 // 是否把php错误抛出到fastcgi中

咱俩平时会被问到,error_reporting和display_errors有啥界别吧?这四个函数是一点一滴不均等的。

PHP暗许是会在日记和正规输出(如果是fpm情势标准输出正是页面)

error_reporting的参数是不对品级。表示什么体统的等级才应该接触错误。假诺大家报告PHP,所有错误品级都无需触发错误,那么,不管是日记,仍旧页面,都不会显得那么些似是而非,就一定于如何都还没有发出。

display_errors是决定是不是要在正式输出浮现错误新闻
log_errors则是调控是还是不是要在日记中记录错误消息。

error_log是体现错误日志的岗位,这几个在php-fpm中数12遍会被重写,于是多次会开采的是cli和fpm的谬误日志竟然不是在同一个文件中。

ignore_repeated_errors这几个标志调整的是要是有重新的日志,那么就只会记录一条,比方上面包车型客车顺序:

error_reporting(E_ALL);
ini_set('ignore_repeated_errors', 1);
ini_set('ignore_repeated_source', 1);

$a = $c; $a = $c; //E_NOTICE
//Notice: Undefined variable: c in /tmp/php/index.php on line 20

本来会现身五遍NOTICE的,然而今后,只会现出一回了…

track_errors开启会把最后一个错误消息存款和储蓄到变量里面去,这一个恐怕在对记日志的时候会有一点用场吧。但是自身感觉真是没啥用…

html_errors 和 docref_root 七个是个挺有人性化的布局,配置了那多个参数现在,大家重回的错误新闻中生龙活虎旦有后生可畏部分在文档中有个别音信,就能够变成链接情势。

error_reporting(E_ALL);
ini_set('html_errors', 1);
ini_set('docref_root', "https://secure.php.net/manual/zh/");

include("a2.php"); //E_WARNING

能让你火速稳定到我们现身谬误的地点。是或不是很人性~

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设置决断慢日志的时间长度。

总结

咱俩平时弄混的正是日记难题,以至有些级其他日记为啥并未有记录到日志中。最关键的是要看error_log,display_errors, log_errors那么些布局,只是在看安顿的时候,我们还要小心区分php.ini里面包车型地铁计划是何等,php-fpm.ini里面的构造是何许。

好呢,小编认为弄懂那些安排,基本就未有php日志记录不断的WTF的标题了。

上一篇:没有了 下一篇:没有了