面试中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服务器后继续执行,不会影响输出返回,不会阻塞代码。
(1).创建数据库test ,创建表shop(字段id,total),商品id是1,商品总数10 (2).PHP模拟购买,商品数量大于0才能购买<?php //连接数据库 $con=mysqli_connect("192.168.2.18...
项目需要使用websocket推送最新订单,客户服务器非linux不支持swoole,因此使用原生,直接上代码(1).PHP服务端<?php ini_set('error_reporting', E_ALL ^ E_NOTICE); ini_set...
第一次听说端口复用是在mixphp最新版本中发现的,mixphp启动监听9501端口,现在作者说可以多开几个进程来执行mixphp,我心里想了下再启动不是会端口冲突嘛,但是却没有问题,于是下载mixphp的源码解读,原来是启动http服务器使用new Co\Http\Server('0.0....
【一】.无锁场景:多个人购买一件商品,库存减少。商品表:主键 商品名 库存数量 id name stock 1&nb...
本教程使用的定时任务基于EasyTak实现,EasyTask官方参考文档:https://gitee.com/392223903/EasyTask首先我们必须明白PHP的定时器只能基于CLI命令行形式运行...
场景:模拟验证码发送。仅做代码演示。(1).创建一个验证码发送接口sendCaptcha/** * 发送验证码 */ public function sendCaptcha() { //外部参数(获...