最近剛剛完成了一個項目,基本功能都正常後,就發佈到線上。結果上線一下子就發現產生了大量的錯誤,以下圖php
一看都是PHP的Deprecated錯誤,是級別最低的那種。
PHP官方手冊對錯誤級別的解釋以下:mysql
參看:PHP官方說明正則表達式
查看了第一條的詳細信息,sql
由上圖能夠看出,錯誤緣由是在common.ini.php中使用了eregi函數,引起了Deprecated錯誤。
問題代碼在common.ini.php的52行。
查看代碼:數據庫
phperegi('.([^.]*$)', $fileName, $ extension);
產生的錯誤,這是一個獲取文件後綴名的正則表達式。函數
錯誤的緣由是PHP不推薦使用eregi函數處理正則表達式。
引用PHP官方5.3兼容文檔,其表述以下:oop
參看:PHP官方說明性能
PHP官方指出,PHP5.3不推薦使用eregi函數,建議使用preg_match函數代替。spa
接下來把eregi換成perg_match,而後對正則表達式進行修改。
採用perg_match的代碼以下:.net
phppreg_match('/.([^.]*$)/', $fileName, $ extension);
這樣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來訪問數據庫。