当前位置:首页 > PHP > 正文内容

PHP异常处理,PHP自定义错误,PHP记录错误日志

高老师8年前 (2019-03-23)PHP1719

面试中PHP面试官会问调用一个不存在的方法,如何知道是哪个文件哪行调用的?假设方法是getWorkLoad()

回答1:开启PHP错误输出,PHP会输出Fatal error: Call to undefined function getWorkLoad() in D:\wwwroot\thinkpay\index.php on line 5 

回答2:自己编写一个错误处理日志记录的工具来记录错误信息

面试中答案1只适合开发环境,答案2各种环境都支持。

实现一个日志系统其实并不难,例如thinkphp开启调试模式就能使用他们编写的日志跟踪功能。要记录错误日志,就能做异常处理,异常处理到底有哪些?

PHP的异常类别:

E_ERROR:通常会显示出来,也会中断程序执行。
E_WARNING:通常都会显示出来,但不会中断程序的执行。
E_NOTICE:在脚本正常运行下发生的代码错误。
E_PARSE:语法解析错误。

E_CORE_ERROR:在PHP启动时发生的致命错误。
E_CORE_WARNING:报告在PHP启动时发生的非致命性错误。
E_COMPILE_ERROR:编译时发生的致命错误,指出脚本的错误。

E_USER_ERROR:用户产生的错误信息。
E_USER_WARNING:用户产生的警告信息。
E_USER_NOTICE:用户引发的注意消息。

E_STRICT:编码标准化警告,运行时发生的错误。
E_RECOVERABLE_ERROR:接近致命的运行时错误,若未被捕获则视同E_ERROR。

E_ALL:所有的错误和警告

一般我们捕获异常都是使用try{} catch(){} ,但是如果有些错误没有抛出如何捕获呢?PHP提供了3个函数set_error_handler(),register_shutdown_function(),set_exception_handler()用于处理错误异常。

3个函数的作用:

set_error_handler() :能处理E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,E_STRICT,该函数只能捕获系统产生的一些Warning、Notice级别的错误
register_shutdown_function() :捕获PHP的错误:Fatal Error、Parse Error等,这个方法是PHP脚本执行结束前最后一个调用的函数,比如脚本错误、die()、exit、异常、正常结束都会调用
set_exception_handler() : 设置默认的异常处理程序,用在没有用try/catch块来捕获的异常

面试官考的调用不存在的方法,那么肯定是属于Fatal error类型,需要使用 register_shutdown_function()来处理。

代码如下:

<?php
//线上环境关闭全部错误输出
ini_set("display_errors", "Off");

function shutDealWith()
{
    //存在错误
    if (error_get_last()) {
        //打印错误或者记录
        print_r(error_get_last());

        //文件日志进行记录
    }
}

//注册PHP脚本执行完成执行的方法
register_shutdown_function('shutDealWith');

//调用不存在的方法
getWorkLoad();

但是日志系统是基于文件IO的,性能不佳,记录日志会影响http请求响应时间,面试官可能会考。如果是swoole投递异步任务即可,如果是fpm可以直接扔到redis让队列处理。另外fpm还提供了一个fastcgi_finish_request函数在请cgi返回给web服务器后继续执行,不会影响输出返回,不会阻塞代码。

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.20230611.cn/post/76.html

分享给朋友:

“PHP异常处理,PHP自定义错误,PHP记录错误日志” 的相关文章

php将html转为pdf,php将html页面导出pdf

php将html转为pdf,php将html页面导出pdf

首先下载wkhtmltox-0.12.4_linux-generic-amd64.tar.xz   (不要下载RPM包,依赖太多,需要x-server支持),并解压,执行测试运行正常tar wkhtmltox-0.12.4_linux-generic-amd64.tar.xzcd...

 php 判断是否post,php判断是否post提交,php 判断是否为post,php 判断get 还是post

php 判断是否post,php判断是否post提交,php 判断是否为post,php 判断get 还是post

if($_SERVER['REQUEST_METHOD'] == 'POST') { echo('This is  post '); } elseif ($_SERVER['...

php 数组转换xml,php 数组转成xml,php数组转xml 函数

php 数组转换xml,php 数组转成xml,php数组转xml 函数

源码:特别适用于微信支付中通知微信支付网关function array2xml($arr, $level = 1) { $s = $level == 1 ? "<xml&g...

 php监听事件,php触发事件

php监听事件,php触发事件

逛公众号文章看到文章"php实现事件监听与触发的方法,你用过吗?",我就好奇了,php又不是asp.net的webform,哪里来的服务端事件监听。于是学习了一波。先看下监听类:class Event {     /** &nbs...

php arrayaccess的应用场景:配置管理器

php arrayaccess的应用场景:配置管理器

上篇文章已经讲解arrayacces的原理,现在来讲解下arrayaccess的实际应用。一个大型的互联网项目中必然会存在各种配置信息,例如多种数据库信息:mysql,tidb,mongodb,redis,某个业务模块单独的配置信息如比例,额度等等,那么该如何治理配置信息?PHP项目中大部分的框架都...

php json_encode 使用注意

php json_encode 使用注意

参数中包含gb2312的字符串,返回结果是false或者null(不同PHP版本具有差异性)代码:<?php $dbms = 'mysql'; $host = '192.168.8.8'; $dbName =&n...