PHP 差错与异样的日志记载
错误与非常的不同
关于错误与非常,我们可以用一个简便的例子来懂得:
<?php try { 1 / 0; } catch (Exception $e) { echo "catched", PHP_EOL; }
施行这个小示例会直接得到一个『PHP Warning: Division by zero …』错误。缘由很简便:这是逻辑错误,并不是非常,所以不克不及被 try 捕捉。一样,关于变量使用前不决义这种问题,也是一样的会发生 warning 而不是被捕捉。
但是这个问题在 PHP7 中却有了一些改动,比方上面的例子中我把 / 改成 %,在 PHP7 的环境中施行会得到一个不一样的提醒:
PHP Fatal error: Uncaught DivisionByZeroError ...
按照这个提醒,假如我把 catch 中的前提修改一下:
<?php try { 1 / 0; } catch (DivisionByZeroError $e) { echo "catched", PHP_EOL; }
这样就可以正常捕捉到错误并输出 catched 了。
关于第一个示例,一样假如把 Excepiton 修改为 ErrorException 也可以正常捕捉。
至于为什么求余和除法,在 PHP5 中提醒一致而在 PHP7(我的测试环境是 7.0.4) 中除法不属于 DivisionByZeroError 的问题,这应当是个 BUG。
日志的记载
PHP 本身可配置的 log 大约有以下几个:
● php-fpm error log(php-fpm.conf 中配置,记载 php-fpm 进程的启动和终止等信息)
● php-fpm slow log(也是在 php-fpm.conf 中配置,记载慢施行)
● php error log(php.ini 中配置,记载利用程序的错误日志)
此外 Nginx 还有两个可配置的log:access 和 error log。这几个日志文件的功效不一样,记载的内容也不一样。但其中有一个点需要留意:假如配置了 php-fpm 中的 error log 位置,但日志位置不成写(配置时位置得是对的,由于 php-fpm 启动时会做检查),在恰当的配置前提下错误日志会被返回到 cgi 中从而写入 nginx 的 error log 中。
所以碰到问题是我们一样的查寻思绪都是:
1.到 Nginx access log 中查看恳求的状态码
2.查看 php error log 中的错误记载乃至 stack 信息
3.查看 php-fpm log 中有无非常重新启动记载(假如中心或者扩展问题,会显现此状况)
但是在以上几种状况下你也会发明,这里面并没有上文提到的程序抛出非常的日志记载。
非常记载
非常不一样于错误,严厉上说它是利用程序逻辑的非常而不是错误,是可以通过合理的程序逻辑来手动触发的。但大多状况下非常也是要停止记载的,比方数据库没法连接或者框架的不妥使用触发的非常,我们需要通过日志来定位问题并及时处置。
PHP 供给了两个函数用于自定义处置错误和非常的办法:
● set_error_handler
● set_exception_handler
所以可以通过 set_exception_handler 函数注入办法捕捉所有的非常并记载 。
monolog 是一个优异的非常记载的库,也是基于 PSR-3 标准的实现。Laravel、Symfony 中默许也是使用它来记载非常。如有需要,也可以思考在本人的项目中引入。
以上就是PHP 错误与非常的日志记载的具体内容,更多请关注百分百源码网其它相关文章!