Home  >  Article  >  Backend Development  >  从PHP的Deprecated错误说开去

从PHP的Deprecated错误说开去

WBOY
WBOYOriginal
2016-06-20 12:55:041329browse

发现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<?php$loop=10000;$date='2015-06-04';$startTime = microtime(true);for($i=0;$i<$loop;$i++){    if (ereg ("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $date, $regs)) {        echo "$regs[3].$regs[2].$regs[1]";    } else {        echo "Invalid date format: $date";    }}echo 'processing time: ', (microtime(true) - $startTime), "\r\n";

结果是:
[有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来访问数据库。

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn