资讯专栏INFORMATION COLUMN

PHP性能杀手--Deprecated错误

0xE7A38A / 755人阅读

摘要:发现问题最近刚刚完成了一个项目,基本功能都正常后,就发布到线上。分析问题错误的原因是不推荐使用函数处理正则表达式。用替换掉后不仅错误没了,而且性能也大大提高了。错误存在潜在的兼容性问题,要引起大家的重视。

发现Deprecated问题

最近刚刚完成了一个项目,基本功能都正常后,就发布到线上。结果上线一会儿就发现产生了大量的错误,如下图

一看都是PHP的Deprecated错误,是级别最低的那种。
PHP官方手册对错误级别的解释如下:

参看:PHP官方说明

查找Deprecated问题

查看了第一条的详细信息,


由上图可以看出,错误原因是在common.ini.php中使用了eregi函数,引发了Deprecated错误。
问题代码在common.ini.php的52行。
查看代码:

phperegi(".([^.]*$)", $fileName, $ extension);

产生的错误,这是一个获取文件后缀名的正则表达式。

分析Deprecated问题

错误的原因是PHP不推荐使用eregi函数处理正则表达式。
引用PHP官方5.3兼容文档,其表述如下:

参看:PHP官方说明

PHP官方指出,PHP5.3不推荐使用eregi函数,建议使用preg_match函数代替。

解决Deprecated问题

接下来把eregi换成perg_match,然后对正则表达式进行修改。
采用perg_match的代码如下:

phppreg_match("/.([^.]*$)/", $fileName, $ extension);

这样Deprecated错误就没有了。

研究Deprecated问题

一般情况下,Deprecated 错误即使不修复也不影响运行的,但是对性能是否会有影响呢?
先做一个错误输出的对比试验,关闭display_error输出。
代码如下:

php

结果是:
[有Deprecated]processing time: 0.51678085327148
[无Deprecated]processing time: 0.31887912750244

证明,开启Deprecated 的error_reporting后,性能比关闭下降了一倍。具体原因与下面的Notice一样。
我们再做个试验,分别写了两个PHP程序,一个是存在Deprecated错误的代码,另一个是修复了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来访问数据库。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/20959.html

相关文章

  • PHP 错误与异常

    摘要:但异常捕获后程序可以继续执行,而真正的错误出现后程序就必须终止异常可以使用来捕获捕获,捕获之后后续代码可以继续执行而错误是无法使用捕获的如果抛出了异常,就必须捕获它否则程序终止执行。 PHP错误级别 Parse error > Fatal Error > Waning > Notice > Deprecated Deprecated 最低级别的错误(不推荐,不建议)使用一些过期函数的...

    longmon 评论0 收藏0
  • 让我偷偷的告诉你:运维加薪的杀手锏是啥?

    摘要:但是怎么提加薪比较好呢现在让小编简单介绍下加薪的个杀手锏第一有备而战,一切让业绩说话不要和老板大谈你正在贷款,买车买房。。。你必须向公司证明你值得加薪,用数据来证明你的业绩显然是再明智不过的。 临近年底,辛辛苦苦一年该如何跟老板开口谈加薪成了运维人的心病。但是怎么提加薪比较好呢?现在让小编简单介绍下加薪的 3 个杀手锏: 第一、有备而战,一切让业绩说话 不要和老板大谈你正在贷款...

    monw3c 评论0 收藏0
  • PHP 7 修改了什么呢 -- 2

    摘要:风格的构造函数式构造函数,它与类的名称相同,因为它们是在所定义类的方法,现在已过时,并且将在未来被移除。如果的构造仅仅是一个类中定义构造函数,将发出。类实现构造函数方法不受影响。 PHP7 - use语句 从PHP7起,单次使用 use 语句可以用来从同一个命名空间导入类,函数和常量(而不用多次使用 use 语句)。示例 PHP7 - 错误处理 从PHP7,错误处理和报告已经改变。P...

    leeon 评论0 收藏0
  • php error_reporting()关闭报错

    摘要:至,有同样的行为。表示关闭所有错误报告表示显示二函数说明设置应该报告何种错误说明函数能够在运行时设置指令。后果是导致脚本终止不再继续运行。初始化启动过程中发生的警告非致命错误。用户产少的警告信息。出外的所有错误和警告信息。 错误报告级别:指定了在什么情况下,脚本代码中的错误(这里的错误是广义的错误,包括E_NOTICE注意、E_WARNING警告、E_ERROR致命错误等)会以错误报告...

    noONE 评论0 收藏0
  • PHP7新特性小结

    摘要:标量类型声明在中,引入了一个新的特性,即标量类型声明。弃用样式构造函数是与它们定义的类具有相同名称的方法,现在已被弃用,并且将来将被删除。 showImg(https://segmentfault.com/img/remote/1460000012438557?w=1024&h=456); 说明 PHP 7使用新的Zend Engine 3.0将应用程序性能提高近两倍,内存消耗比PHP...

    Steven 评论0 收藏0

发表评论

0条评论

0xE7A38A

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<