面试中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服务器后继续执行,不会影响输出返回,不会阻塞代码。
首先下载wkhtmltox-0.12.4_linux-generic-amd64.tar.xz (不要下载RPM包,依赖太多,需要x-server支持),并解压,执行测试运行正常tar wkhtmltox-0.12.4_linux-generic-amd64.tar.xzcd...
if($_SERVER['REQUEST_METHOD'] == 'POST') { echo('This is post '); } elseif ($_SERVER['...
源码:特别适用于微信支付中通知微信支付网关function array2xml($arr, $level = 1) { $s = $level == 1 ? "<xml&g...
逛公众号文章看到文章"php实现事件监听与触发的方法,你用过吗?",我就好奇了,php又不是asp.net的webform,哪里来的服务端事件监听。于是学习了一波。先看下监听类:class Event { /** &nbs...
上篇文章已经讲解arrayacces的原理,现在来讲解下arrayaccess的实际应用。一个大型的互联网项目中必然会存在各种配置信息,例如多种数据库信息:mysql,tidb,mongodb,redis,某个业务模块单独的配置信息如比例,额度等等,那么该如何治理配置信息?PHP项目中大部分的框架都...
参数中包含gb2312的字符串,返回结果是false或者null(不同PHP版本具有差异性)代码:<?php $dbms = 'mysql'; $host = '192.168.8.8'; $dbName =&n...