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

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

高老师6年前 (2019-03-23)PHP1352

面试中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生成cookie数组,PHP删除cookie数组

PHP生成cookie数组,PHP删除cookie数组

<?php   //设置Cookies数组 setcookie('Datatype[a]', '1');  setcookie('Datatype[b]', '2');  set...

php 开启错误提示,php 关闭错误提示

php 开启错误提示,php 关闭错误提示

开启错误提示代码:ini_set("display_errors", "On"); error_reporting(E_ALL | E_STRICT);关闭错误提示代码:error_reporting(E_ALL ^&n...

 php xml字符串转数组,phpxml转数组,php 将xml转换成数组

php xml字符串转数组,phpxml转数组,php 将xml转换成数组

001源码:/*  * $xml_str是xml字符串  */ function  xmltoarray($xml_str) { //禁止XML实体扩展攻击 libxml_disable_entity_loader(true); //拒绝包含...

编写php com组件,php调用.net dll,php源码保护

编写php com组件,php调用.net dll,php源码保护

开发com组件可以用c++,vc++,net,我比较熟悉net,演示用dnet(1).创建项目:启动vs2017,新建项目,选择Visual C# ->Windows桌面->类库通用windows(2). 修改Com项目:点击 项目->项目属性,再点击应用程序->程序集信息,...

php上传大文件,php大文件上传

php上传大文件,php大文件上传

(1).前端文件:<form action="upload.php" method="post" enctype="multipart/form-data">    &...

php new class

php new class

<?php $member = new class {     public function getInfo()     {    ...