PHP のエラー メカニズムも非常に複雑ですが、私はこのレッスンでそれを補います。
特記事項: この記事の PHP バージョンは 5.5.32 を使用しています
PHPのエラーレベル
まず、php にどのようなエラーがあるかを理解する必要があります。 php5.5の時点では、合計16のエラーレベルがあります
注: 以下のコードを試すときは、error_log:
を必ずオンにしてください。
E_エラー
このエラーは致命的なエラーであり、このエラーが発生するとページに致命的なエラーが表示され、プログラムは実行を続行できません。
リーリー
リーリー
E_警告
リーリー
E_NOTICE
リーリー
E_PARSE
リーリー
E_STRICT
リーリー
E_RECOVERABLE_ERROR
リーリー
E_非推奨
リーリー
E_CORE_ERROR、E_CORE_WARNING
E_COMPILE_ERROR、E_COMPILE_WARNING
E_USER_ERROR、E_USER_WARNING、E_USER_NOTICE、E_USER_DEPRECATED、
リーリー
E_ALL
エラー制御
php.iniの設定
リーリー
リーリー
NOTICE は本来 2 回表示されますが、現在は 1 回のみ表示されます...
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的问题了。
关于PHP错误机制知识汇总小编就给大家介绍到这里,希望对大家有所帮助!