• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

从PHP的Deprecated错误说开去

php 搞代码 3年前 (2022-01-23) 14次浏览 已收录 0个评论
文章目录[隐藏]

发现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问题

本%文来源gaodaimacom搞#^代%!码网@搞代gaodaima码接下来把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来访问数据库。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:从PHP的Deprecated错误说开去

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址