PHP错误机制知识总结
php的错误机制也非常复杂。我做了好几年PHP,但是没有认真总结。现在我要补上这一课。
特别说明:文章的PHP版本使用了5.5.32。
PHP的错误级别。
首先,我们需要知道php有哪些错误。截至php5.5,有16个错误级别。
注意:请确保在尝试以下代码时打开error_log:
错误报告;ini_set('display_errors ',' On ');E_ERROR
这种错误是致命的,页面上会显示致命错误。当这种错误发生时,程序无法继续执行。
错误示例:
//致命错误:调用/tmp/php/index.php中第5hpinfo()行的未定义函数hpinfo();//E_ERROR请注意,如果出现未捕获的异常,将触发此级别。
//致命错误:未捕获的异常“exception”,在/tmp/php/index.php:5中有消息“test exception ”,在/tmp/php/index.php第5行抛出Stack trace: #0 {main}新\ Exception(‘test Exception’);电子警告
这个错误只是一个警告,脚本不会被终止,程序会继续,显示的错误信息是警告。例如,包含一个不存在的文件。
//警告: include(a.php):未能打开stream:第7行的/tmp/php/index.php中没有此类文件或目录//警告: include() :未能打开第7行的/tmp/PHP/index . PHP include(' a.php)中的' a . PHP '进行包含(include _ path=' ./usr/share/pear :/usr/share/PHP ')//电子警告电子通知
这种错误比较轻微,说明这个地方不应该这样写。这也是一个运行时错误,错误的代码在其他地方可能没有问题,除非在当前上下文中。
例如,如果变量$b不存在,我们将其分配给另一个变量。
//notice :/tmp/PHP/index . PHP中第9行的Undefined variable : b $ a=$ b;//E_NOTICE E_PARSE
编译时出现此错误,编译时发现语法错误,无法进行语法分析。
例如,下面的z没有设置为变量。
//Parse error:语法错误,在/tmp/php/index.php中第20z=1行出现意外的'=';//E_PARSE E_STRICT
这个错误是在PHP5之后引入的,你的代码可以运行,但不是PHP推荐的编写方法。
例如,在函数参数中传递符号。
//Strict standards 3360第17行的/tmp/php/index.php中只能通过引用传递变量函数change($ var){ $ var=10;} $ var=1;变化(var);//E_STRICT E_RECOVERABLE_ERROR
该级别实际上是ERROR级别,但预计会被捕获。如果错误处理没有捕获到它,性能与E_ERROR相同。
经常发生的情况是,参数定义了类型,但是在调用时传入了错误的类型。在E_ERROR的致命错误前面也有一个可碎裂的词。
//可捕获的致命错误:传递给testCall()的参数1必须是A的实例,给定B的实例,在第37行的/tmp/php/index.php中调用,并在第33行的/tmp/php/index.php中定义类A { }类B { }函数testCall(A $ A){ } $ B=new B();test call(b);e _已弃用
此错误表明您使用了旧版本的函数,该函数的较新版本可能已被禁用或未被维护。
例如,curl的CURLOPT_POSTFIELDS使用\@FILENAME上传文件。
//Depresented d : curl _ setopt():不推荐使用@filename API进行文件上传。请在第42行$ ch=curl _ init(' http://www . remote site.com/upload . PHP ')的/tmp/php/index.php中改用CURLFile类;curl_setopt($ch,CURLOPT_POSTFIELDS,array('fileupload'='@ ')。test’);错误,警告
这两个错误是由PHP的引擎产生的,发生在PHP的初始化过程中。
E_COMPILE_ERROR,E_COMPILE_WARNING
这两个错误是由PHP引擎生成的,发生在编译过程中。
电子用户错误,电子用户警告,电子用户通知,电子用户已弃用,
这些错误都是用户造成的。使用trigger_error相当于一个洞,为用户触发各种错误类型。这是逃避try catch异常的好方法。
trigger_error('不能被零除',E _ USER _ ERROR);//E _ USER _ ERROR//E _ USER _ WARING//E _ USER _ NOTICE//E _ USER _弃用E_ALL
E_STRICT所有错误和警告消息。
错误控制
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//the错误在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中经常被重写,所以经常发现cli和fpm的错误日志不在同一个文件中。
忽略重复的错误此标志控制如果有重复的日志,将只记录一个日志,例如以下程序:
错误报告;ini _ set(' ignore _ repeated _ errors ',1);ini _ set(' ignore _ repeated _ source ',1);$ a=$ c;$ a=$ c;//e _ NOTICE//notie:未定义的变量3360 CIN/tmp/PHP/index . phplonline 20,通知会出现两次,但现在只会出现一次。
当track_errors打开时,最后一条错误消息将存储在变量中,这在日志记录中可能很有用。但是我觉得真的没用。
Html_errors和docref_root是非常人性化的配置。配置好这两个参数后,如果我们返回的错误信息中有文档中的一些信息,就会变成链接形式。
错误报告;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自己的log level 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 _ Slow log _ time out=0//Slow log time=/var/log/PHP-fpm/www-Slow . log//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问题了。
这里将介绍PHP错误机制知识的总结,希望对大家有所帮助!
版权声明:PHP错误机制知识总结是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。