OneAPM日前收到一位同学投稿,称其刚完成一个项目,却遇到大量错误,解决了Notice错误之后,性能竟提升了1000多倍。OneAPM会慎重考虑该同学提出的意见,我们会努力做出更好的产品来回馈用户。
以下为主要内容:
最近刚刚完成了一个项目,在测试完基本功能后,我们就发布到线上。结果上线不久就发现产生了大量的错误,如下图:
一看都是PHP的Deprecated错误,是级别最低的那种。PHP官方手册对错误级别的解释如下:
参看:[PHP官方说明]
**查找问题:**
我们查看了第一条的详细信息,
发现问题是在`common.ini.php` 中使用了`eregi`函数,造成了`Deprecated`错误。问题代码在common.ini.php的52行。
下面我们去查看代码:发现是一个获取文件后缀名函数产生的错误:
eregi('.([^.]*$)', $fileName, $ extension);
**分析问题:**
错误的原因是PHP不推荐使用`eregi函数`处理正则表达式。引用PHP官方5.3兼容文档,其表述如下:
链接地址是:https://php.net/manual/zh/migration53.deprecated.php
PHP官方指出,PHP5.3不推荐使用`eregi函数`,建议使用`preg_match函数`代替。
**解决问题:**
接下来把`eregi`换成`perg_match`,然后对正则表达式进行修改。采用`perg_match`的代码如下:

preg_match('/.([^.]*$)/', $fileName, $ extension);
这样`Deprecated`错误就没有了。由此,`Deprecated`也引起了我的兴趣,这个错误到底会对性能有什么影响?一般情况下,`Deprecated` 错误即使不修复也不影响运行的,但是对性能是否会有影响呢?我们先做一个用`error_reporting(0)`关闭`deprecated`错误输出的对比试验。代码如下:
结果是
跑起来看看结果:
trigger deprecated: 0.33528900146484
trigger no deprecated: 0.019602060317993
两的性能相差17.63倍。用preg_match 替换掉ereg后不仅Deprecated错误没了,而且性能也大大提高了。
性能提高的原因是Perl比POSIX处理正则表达式速度更快。
Deprecated错误有潜在的兼容性问题,要引起大家的重视。所有提示Deprecated的函数都是官方不推荐使用的函数,今后新版的PHP有可能对其不兼容。
最典型的案例是PHP5.5.0以后已经不再兼容mysql_query和mysql_connect。
要保证升级PHP版本后,程序正常运行,需要使用mysqli和PDO来访问数据库。
上面我们讲了Deprecated错误对程序的性能影响和存在的潜在问题,那么Notice错误呢?是否也有类似问题?
下面再给大家举个例子,看看Notice对性能的影响。
先看如下代码:
结果如下:
> 1. 对比开启与关闭display的性能
设置`error_reporting(E_NOTICE)`,`display_errors=on/off`,
>* **[开启display]** processing time: 5.4385099411011
>* **[关闭display]** processing time: 0.35786819458008
开启display,程序性能下降10多倍。
因为前端输出数据是比较耗费时间的。
> 2. 对比开启与关闭`error_reporting`的性能(关闭`display_errors`)
设置`error_reporting(0)`或在表达式前加`@`
>* **[开启Notice]** processing time: : 0.35786819458008
>* **[关闭Notice]** processing time: : 0.2298538684845
开启`Notice`错误报告,程序性能下降近60%。为什么开启`Notice`错误报告,性能会下降如此之多呢?打开Notice错误报告后,当出现`Notice`错误时,程序会写日志,日志是文件`IO操作`,文件`IO操作`是比程序执行慢很多的,所以`IO操作`是造成性能下降的罪魁祸首。
Stackoverflow 也有人做过类似的研究,见下图。
链接地址:https://stackoverflow.com/questions/1868874/does-php-run-faster-without
如果修复了Notice后,性能提升多少呢?
与开启`Notice`报告和`display`,
设置`error_reporting(E_NOTICE)`,`display_errors=on`,
结果如下:
trigger notice: 5.4385099411011
trigger no notice: 0.00056695938110352
两者的性能相差1000多倍!
##分析Notice错误
**Notice: Undefined offset: 2 in xxx.php on line 8**
`Undefined xxx `是`Notice`中常见的错误,其表示没有定义该xxx变量就使用了。
大家对待该问题,通常是用关闭报告来解决,如`error_reporting(0)`,此方法是治标不治本,`Notice`问题还是会出现。
我给出的解决办法是`isset($a[ND$i])&&$a[$i]`。解决了`Notice`错误后,性能立马提升1000多倍,**duang,duang,duang!**很爽吧。
从上面`Deprecated`和`Notice`的例子看,`Notice`和`Deprecated`造成的性能损耗要引起大家的重视,必须着手解决PHP应用中这些不起眼的错误了。
________________________________________
在着手解决问题前,我们都是怎么找`Deprecated`和`Notice`这些错误的呢?
开发、运维等童鞋都会说**“去抓log”**,像这个样子
首先,在线上系统中,`Deprecated`和`Notice`错误都是关闭的。日志中根本找不到`Deprecated`和`Notice`错误信息;
其次,有时`log`都非常大,有的能达到好几十G甚至上百G时,找错误是非常难的,而且不直观。
最近找到了一个比较好的工具**[OneAPM](https://oneapm.com/index.html?utm_source=Common&utm_medium=Articles&utm_term=PHP&utm_campaign=TechnicalArticles&from=matefijuph)**,大家可以尝试一下。
**一、错误归类统计**
它的错误信息功能用起来非常方便,`Deprecated`和`Notice`也都能抓取到,比查`log`方便多了。
在列表里能够看到所有的错误,以及发生次数,让我一下子就能知道各个错误造成的影响。
**二、定位问题准确**
针对每一个具体的问题,从错误详细信息中,能够精确定位到错误所在文件和行数,直接就看到bug的位置,不错。
**三、管理项目方便**
因为管理项目较多,一直想找比较好的工具统一管理各个项目,**OneAPM**帮我解决了这个问题。
从上图中能观察不同项目的运行情况,当某些项目的错误率升高了,不仅能收到短信和邮件报警,而且直接能找到项目的错误信息,查找问题方便许多。
##同时有些问题也想跟**OneAPM**说一下
**一、没有按照错误原因归类功能,如下图**
这里的所有Notice都是一个php文件的同一行代码造成的,如果能有归类,这样我能够统计该错误发生的次数。
**二、增加搜索功能**
有时我就想先查找关心的错误,如`error`和`warning`的错误,但是整个列表里大部分是`Notice`和`Deprecated`,现在让我找重要错误比较困难。
**三、报表中也希望增加对错误信息的报告**
到这里我们对`Notice`和`Deprecated`有了更深刻的认识,以往我们都不关心这类错误,存在没想到有这么大的影响。
过去从错误日志查问题的方式已经过去。现在借助**OneAPM**实现错误信息的实时美观地反馈,并能得到错误分析报表。

本文来自作者[丹晓星]投稿,不代表调研号立场,如若转载,请注明出处:https://kydy.org.cn/miao/7525.html
评论列表(4条)
我是调研号的签约作者“丹晓星”!
希望本篇文章《【php软件库源码,PHP软件下载】》能对你有所帮助!
本站[调研号]内容主要涵盖:调研号,生活百科,小常识,生活小窍门,百科大全,经验网
本文概览: OneAPM日前收到一位同学投稿,称其刚完成一个项目,却遇到大量错误,解决了Notice错误之后,性能竟提升了1000多倍。OneA...