您好,欢迎访问一九零五行业门户网

从PHP的Deprecated错误说开去

发现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来访问数据库。
其它类似信息

推荐信息