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兼容文档,其表述如下:

链接地址是:http://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 也有人做过类似的研究,见下图。

链接地址:http://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](http://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**实现错误信息的实时美观地反馈,并能得到错误分析报表。

php notice 性能,【OneAPM出品】解决Notice错误性能提升相关推荐

  1. plm服务器 硬件性能,如何对PLM系统进行性能诊断与调优?

    原标题:如何对PLM系统进行性能诊断与调优? PLM系统是企业最重要的信息系统之一,尤其对于研发人员,PLM系统更是日常工作中非常重要的一环.随着时间的推移,企业对PLM系统的相关应用越来越深入,一方 ...

  2. php notice undefined variable,PHP提示Notice: Undefined variable错误的解决办法

    在调试程序的时候,会出现 Undefined variable错误,例如: Notice: Undefined variable: insert in - Notice: Undefined vari ...

  3. Notice: Undefined offset 的解决方法

    Notice: Undefined offset 的解决方法 参考文章: (1)Notice: Undefined offset 的解决方法 (2)https://www.cnblogs.com/ha ...

  4. Notice: Undefined offset:——屏蔽掉notice

    PHP Notice: Undefined offset:--屏蔽掉notice: 最简单的做法就是在程序开头加上:error_reporting( E_ALL&~E_NOTICE ); 就可 ...

  5. Redis性能问题排查解决手册(值得收藏)

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:今天给大家推荐 6 个 Spring Boot 项目,拿来就可以赚钱! 个人原创100W+访问量博客:点击前往, ...

  6. 如何解决ORA-04031错误

    诊断并解决ORA-04031错误 当我们在共享池中试图分配大片的连续内存失败的时候,Oracle首先清除池中当前没使用的所有对象,使空闲内存块合并.如果仍然没有足够大单个的大块内存满足请求,就会产生O ...

  7. Redis性能问题排查解决手册(七)

     阅读目录: 性能相关的数据指标 内存使用率used_memory 命令处理总数total_commands_processed 延迟时间 内存碎片率 回收key 总结 性能相关的数据指标 通过Red ...

  8. 解决棘手SQL性能问题,我的SQLT使用心得

    本文转载自dbaplus社群 作者介绍 丁俊,新炬网络首席性能优化专家,SQL审核产品经理.<剑破冰山-Oracle开发艺术>副主编,ITPUB开发版资深版主,十余年电信行业从业经验. 一 ...

  9. 从几百个生产环境总结出的Redis性能问题排查解决手册(值得收藏)

    点击上方蓝字,关注我们 阅读目录: 性能相关的数据指标 内存使用率used_memory 命令处理总数total_commands_processed 延迟时间 内存碎片率 回收key 总结 性能相关 ...

最新文章

  1. 微信小程序wx:for 的使用
  2. libevent源码深度剖析
  3. 不想CRUD干到老,就来看看这篇OOM排查的实战案例!
  4. java负载均衡框架_SpringCloud与Consul集成实现负载均衡功能
  5. NOIP2009潜伏者【B003】
  6. cmd锁定计算机病毒,反病毒常用CMD命令大全
  7. mysql用if判断关联的表_mysql表连接,子查询以及if判断
  8. POJ3259-负权回路判定
  9. uni-app中的tabBar配置
  10. 【SPOJ5971】LCMSUM
  11. C# json解析字符串总是多出双引号_一篇长文带你在python里玩转Json数据
  12. 第二次作业-Steam软件分析
  13. 人体存在感应雷达技术,车内生命体征检测,毫米波雷达探测模块
  14. php发起预约申请,php版微信公众平台实现预约提交后发送email的方法
  15. 安卓手机5个好用的思维导图软件
  16. 小鼠大脑解剖图分区_大鼠解剖图_求助:大鼠#47;小鼠脑部解剖图谱
  17. PHP实现图片转字符画
  18. Syzmlw 蜗居在线播放
  19. Java面试知识点(六十五)Java注解(下)——实战篇
  20. 计算机组装实训写总结,计算机组装维护实训总结.doc

热门文章

  1. CVPR2020|比CNN更强有力,港中文贾佳亚团队提出两类新型自注意力网络
  2. 主题 02:如何设计系统预案(Preplan)?
  3. 中国品牌授权市场规模分析:2020年中国授权商品零售额为1106亿元,同比增长11.5%[图]
  4. Git无法clone问题
  5. java中的字符retry: 是什么?
  6. 【游戏逆向】CS1.6无后坐力基址寻找
  7. java数组 初始化_用Java初始化数组
  8. 3. 机器人正运动学---坐标系及其变换
  9. 简述python文件操作的流程_Python文件操作详解
  10. 获取微信公众号的二维码图片