首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 效能優化 56 條實戰守則:從語法細節到架構層面的完整指南

     編輯:PHP 綜合知識

前言

PHP 效能優化非單一技巧,而是系統性工程。本文整理 56 條實戰守則,涵蓋語法、函式選擇、記憶體、資料庫、快取、Web 伺服器等層面,附帶實測數據與原理解析。

語法與語言層面

1. 能靜態就靜態

靜態方法調用無需實例化,省去物件建構開銷。十萬次以上調用可見 3 倍以上差距。但靜態方法常駐記憶體,濫用會增加記憶體壓力。

2. echo 優於 print

echo 無回傳值,print 回傳整數。實測 echo 快約 8%。大字串輸出時啟用 ob_start 或 Apache mod_deflate 壓縮。

3. 循環前預計算上限

// 差
for ($i = 0; $i < count($arr); $i++) { ... }
// 好
$len = count($arr);
for ($i = 0; $i < $len; $i++) { ... }

4. 及時銷毀大變數釋放記憶體

PHP 陣列/物件記憶體利用率極低(C 需 100MB,PHP 可能佔 1GB)。用完立即 unset($bigArray),長期運行腳本(如 Worker)尤為關鍵。

5. 謹慎使用魔術方法

__autoload 若無法高效對應類名到實體檔案,會觸發大量 file_exists 磁碟 I/O。建議制定清晰對應規則(PSR-4)並使用 Composer 自動載入(類別映射快取)。

6. 避免 require_once

require_once 需檢查是否已載入,改用 require/include 配合自動載入器。

7. 引入檔案使用絕對路徑

避免 include_path 遍歷查找,減少系統呼叫開銷。

8. 取腳本啟動時間用 $_SERVER['REQUEST_TIME']

直接取得已計算好的值,比 time() 快。

9. 字串操作優先用內建函式,避免正則

strtr 單字元替換用字串而非陣列:strtr($str, 'abcd', 'efgh') 比陣列版快 10 倍。

10. str_replace vs preg_replace vs strtr

  • strtr > str_replace > preg_replace
  • 先用 strpos 判斷是否需替換:無需替換時快 200%

11. 參數簡單化:字串優於陣列

函式同時支援字串與陣列參數時,拆分為多次字串呼叫往往更快。

12. 避免 @ 抑制錯誤

@ 內部操作複雜,循環中使用慢 3 倍。改用 error_reporting(0) 區塊控制。

13. 陣列鍵名加引號

$row['id'] 比 $row[id] 快 7 倍(後者先嘗試常數查找)。

14. 循環內勿呼叫函式

for ($i=0; $i 每次迴圈都呼叫 count()。

15-19. 變數作用域效能階層

局部變數 (最快) ≈ 類方法內局部變數
< 全域變數 (慢 2x)
< 物件屬性 $this->prop (慢 3x)
< 未宣告局部變數 (慢 9-10x)

20. 未使用的全域變數也有開銷

PHP 可能檢查存在性。

21. 方法數量不影響效能

類別內方法多寡不影響單一方法呼叫速度。

22. 子類方法優於基類

繼承鏈越短查找越快。

23. 空函式/方法呼叫成本

函式 ≈ 7-8 次 $i++,方法 ≈ 15 次。

24. 單引號優於雙引號

雙引號需解析變數,單引號不解析。大字串連接用單引號 + .。

25. echo 多參數用逗號,不點號

echo $a, $b; 避免字串連接產生暫時字串。

26. 靜態 HTML 比 PHP 快 2-10 倍

能靜態化就靜態化,或用快取生成靜態檔。

快取與儲存層面

27. 善用快取,推薦 Memcached/Redis

分散式記憶體快取,減輕 DB 壓力。OPcache 快取編譯後 opcode,免重複編譯。

28. IP 存整數

ip2long()/long2ip() 存 INT UNSIGNED,省 1/4 空間,利於排序與範圍查詢。

29. 驗證 Email 域名存在性

checkdnsrr() 確認域名有對應 IP。

30. 改用 mysqli_* / PDO

mysql_* 已棄用移除,mysqli 支援預處理、事務、多查詢。

31. 三元運算子

$x = $cond ? $a : $b; 簡潔且略快於 if/else。

32. 善用 PEAR/Composer 套件

勿重複造輪子,成熟套件經過優化測試。

33. 生產環境關閉錯誤顯示

error_reporting(0) 或 php.ini: display_errors=Off,防洩漏 SQL/路徑。

34. 大字串壓縮存 DB

gzcompress()/gzuncompress()(gzip 演算法)壓縮率 90%+。

35. 參考傳遞實現多返回值

function foo(&$var) { ... } 避免大陣列複製。

36. 徹底理解 SQL 注入與魔術引號

永遠使用預處理語句(Prepared Statements)。

37. isset 替代 strlen 檢查長度

// 差
if (strlen($foo) < 5) { ... }
// 好
if (!isset($foo[5])) { ... } // 語言結構,無函式呼叫開銷

38. 前置遞增 ++$i

需 3 opcode,後置 $i++ 需 4 opcode(建立暫時變數)。

39. 避免無謂變數複製

// 差
$desc = $_POST['description']; echo $desc;
// 好
echo $_POST['description'];

惡意輸入 512KB 導致 1MB 記憶體佔用。

40. switch 優於多重 if/else

可讀性佳,內部跳躍表優化。

41. file_get_contents 替代 fopen/fread 系列

整體讀取更高效,注意 PHP 版本對 URL 開啟支援。

42. 減少檔案操作

能用快取/記憶體就不用檔案。

43. SQL 優化:少 Insert/Update,優化 Select

批次寫入、覆蓋索引、避免 SELECT *。

44. 盡用內建函式

C 實作遠快於 PHP 使用者空間實作。

45. 循環內勿宣告大變數/物件

移至循環外複用。

46. 多維陣列避免巢狀迴圈賦值

考慮 array_walk_recursive 或重新設計資料結構。

47. foreach 優於 while/for

內部優化,語法簡潔。

48. i+=1 代替 i=i+1

符合 C/C++ 慣例,略快。

49. 用完全域變數 unset()

釋放符號表項目。

50. 非必需勿過度 OOP

每個方法/物件調用有開銷,關鍵路徑可用程序式寫法。

51. 方法粒度適中

過度拆分增加調用開銷,聚焦真正複用的邏輯。

52. 耗時函式考慮 C 擴充

核心運算下沉到 C 層(如 PHP-FFI、Zephir、原生擴充)。

53. 啟用 Apache mod_deflate

傳輸層壓縮,配合 echo 大輸出效果顯著。

54. DB 連線用完即關,避免長連線

釋放資源,防連線池耗盡。

55. split vs explode

實測 split(支援正則分隔)平均快 23%,但 split 已棄用(PHP 7 移除),實務請用 preg_split 或 explode。

總結

優化是權衡藝術:正確性 > 可讀性 > 效能。優先解決演算法複雜度、資料庫索引、快取策略等大項,再微調語法細節。建立效能基準(Profiling:Xdebug、Blackfire、Tideways),針對熱點優化,避免過早優化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved