PHP性能杀手--Deprecated错误

发现Deprecated问题

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

clipboard.png

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

clipboard.png

参看:PHP官方说明正则表达式

查找Deprecated问题

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

clipboard.png
由上图能够看出,错误缘由是在common.ini.php中使用了eregi函数,引起了Deprecated错误。
问题代码在common.ini.php的52行。
查看代码:数据库

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

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

分析Deprecated问题

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

clipboard.png

参看:PHP官方说明性能

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

解决Deprecated问题

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

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来访问数据库。

相关文章
相关标签/搜索