$i++ 比 $i = $i + 1 快(Opcode 更少)"Hello $name" → 'Hello ' . $namenew 或宣告array_column/array_mapstrpos、substr、str_replace 避免正則preg_match 比 strpos 慢 10 倍以上file_get_contents 取代 fopen/fread 系列:單一呼叫、內部最佳化json_decode($json, true) 回傳陣列比物件快:少建立物件開銷EXPLAIN 分析執行計畫INSERT ... VALUES (...), (...), ... 單次提交opcache.enable=1、opcache.jit=1255 (PHP 8+)ETag、Last-Modified、Cache-Controlcomposer dump-autoload -o --classmap-authoritative<?php
// perf_check.php - 放專案根目錄執行
$checks = [
'OPcache' => ini_get('opcache.enable') == '1',
'JIT' => ini_get('opcache.jit') !== '',
'PHP版本' => version_compare(PHP_VERSION, '8.2', '>='),
'錯誤顯示關閉' => ini_get('display_errors') == '0',
'錯誤記錄開啟' => ini_get('log_errors') == '1',
'時區設定' => ini_get('date.timezone') !== '',
'上傳限制合理' => (int)ini_get('upload_max_filesize') <= 100 * 1024 * 1024,
];
echo "PHP 效能環境檢查\n";
foreach ($checks as $name => $pass) {
echo ($pass ? '✅' : '❌') . " $name\n";
}
| 誤區 | 真相 |
|---|---|
isset() 比 array_key_exists() 快很多 | 確實快,但語意不同:isset($arr['k']) 對 null 值回傳 false |
| 單引號永遠比雙引號快 | 現代 PHP 優化後差異微小,優先考慮可讀性 |
| 正則表達式邪惡 | 複雜模式匹配正則是唯一選擇,關鍵是避免濫用 |
| 全域變數邪惡 | 超全域變數 ($_GET 等) 必須用,自訂全域變數才要避免 |
「過早優化是萬惡之源」—— Donald Knuth
先寫正確、可讀、可測試的代碼 → Profiling 找瓶頸 → 針對性優化 → 驗證效果