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來訪問數據庫。

相關文章
相關標籤/搜索