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

PHP 進階之路(三):效能優化實戰技巧

     編輯:PHP 綜合知識

1. 字串取代:str_replace 遠快於 ereg_replace/preg_replace

不需要正則表達式功能時,**永遠優先用 str_replace**。

<?php
$string = '<i>italic</i> <b>bold</b>';
$iterations = 100000;

// str_replace
$start = microtime(true);
for ($i = 0; $i < $iterations; $i++) {
    str_replace(['<i>', '</i>'], ['<em>', '</em>'], $string);
}
echo 'str_replace: ' . (microtime(true) - $start) . 's';  // ~0.08s

// preg_replace
$start = microtime(true);
for ($i = 0; $i < $iterations; $i++) {
    preg_replace('/<\/?i>/', '<em>', $string); // 簡化示意
}
echo 'preg_replace: ' . (microtime(true) - $start) . 's'; // ~0.25s

實測差距:單純字串取代 str_replace 約 **3-5 倍** 速度。ereg_replace 已於 PHP 7 移除。

2. 字串引號:單引號比雙引號快

  • 雙引號:解析器掃描變數插值、跳脫序列
  • 單引號:視為字面字串,僅處理 \' 和 \\
$name = 'World';
// 較慢
echo "Hello $name\n";
// 較快
echo 'Hello ' . $name . "\n";

微觀效能差異極小 (納秒級),但在**百萬級迴圈**或**高流量熱點路徑**可觀測到差異。建議:預設用單引號,需插值/換行才用雙引號或 Heredoc/Nowdoc。

3. 資料庫操作:避免不必要的 JOIN

測試環境:foo 表 1,000 筆,big_foo 表 1,000,000 筆 (相當於 foo 自 JOIN)。

查詢耗時 (秒)說明
SELECT * FROM foo0.032基準
SELECT * FROM foo a, foo b (Cartesian Product)17.281,000 × 1,000 = 1,000,000 列
SELECT * FROM foo a, foo b WHERE a.id > b.id14.65仍產生大量中間結果
SELECT * FROM foo a, foo b WHERE a.id = b.id0.041等值 JOIN,索引命中極快
SELECT * FROM big_foo25.39單表百萬筆全掃描

結論:

  • **無條件/範圍條件 JOIN 極其昂貴** — 笛卡兒積爆炸
  • **等值 JOIN + 索引** 效能可接受
  • 大表單查 (big_foo) 速度與無條件 JOIN 同數量級
  • **優化策略**:拆分為多步驟查詢、應用層組合、善用索引、必要時去正規化/快取

4. include vs require 差異與陷阱

特性includerequire
失敗行為發出 Warning,腳本繼續執行發出 Fatal Error,腳本終止
條件包含動態評估,if ($cond) include $file; 依條件決定**編譯期**無條件包含,if ($cond) require $file; 仍會包含
迴圈中動態檔名while($i++) include "file$i.php"; ✅ 正常while($i++) require "file$i.php"; ❌ 重複包含同一檔
回傳值可接收 return 值同

實務建議:

  • 核心必要檔案 (設定、自動載入器) 用 require_once
  • 選用性模組/模板用 include_once
  • 迴圈/動態路徑**必須用 include**

5. echo vs print

特性echoprint
回傳值無永遠回傳 1 (可用於複合運算式)
多參數echo 'a', 'b', 'c'; (無逗號連接開銷)單一參數 print 'a'.'b'.'c'; 需先連接
速度略快 (無回傳值處理)略慢
優先使用✅ 一般輸出極少見需回傳值場合

綜合優化清單 (生產環境檢核)

  1. 啟用 **OPcache** (php.ini: opcache.enable=1, opcache.memory_consumption=256)
  2. 使用 **Composer Classmap/PSR-4 自動載入**,避免手動 include
  3. 資料庫:**Prepared Statement + 索引 + 避免 N+1 查詢 + 讀寫分離 + Redis 快取**
  4. 靜態資源:CDN、Cache-Control、Gzip/Brotli、HTTP/2 或 HTTP/3
  5. Session:Redis/Memcached 儲存、session_write_close() 釋放鎖
  6. 程式碼:str_replace、單引號、echo 多參數、嚴格型別宣告 (PHP 7+)、避免全域變數
  7. 監控:Xdebug/Blackfire 分析熱點、New Relic/Datadog APM 持續觀測
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved