面试中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服务器后继续执行,不会影响输出返回,不会阻塞代码。
<?php /* *算法学习自百度.只是学习和记录 */ header("Content-type:text/html;charset=utf-8"); //1.设置奖项,id是奖项id,name是中奖名称,v是中奖概率 $arr =&n...
在一个正式项目中操作人员提交239个产品信息进行保存,但是系统却提示没有提交239个产品,于是开启错误信息,显示如下:Warning: Unknown: Input variables exceeded 1000. To incr...
PHP不像net支持多继承,自身只支持单继承,为了解决这个问题,php出了Trait这个特性,减少单继承语言的限制。并且能让代码复用率更高。说白了就是一个对象的属性和方法扩展工具一样。例如:trait exts { public f...
(1).config.php 配置文件<?php /** * RabbitMQ_Config */ $config = [ 'host' => ...
最近在编写windows php多线程的东西,从官网下载了PHP的线程安全版,尝试开启curl扩展extension=php_curl.dllphp -m 却提示 PHP Startup: Unable to load dynamic library 'C:\php\ext\php_curl...
概念请参考w3school文章: redis watch ,redis exec (看完基本秒懂)(1)基本事务://连接本地的 Redis 服务 $redis = new Redis(); $redis->con...