PHP 擁有超過 1000 個內置函數,許多強大功能藏在鮮少使用的函數中。本文精選 10 個「知道後相見恨晚」的函數,涵蓋字符串比較、調試、性能分析、壓縮、瀏覽器識別等實戰場景。
echo levenshtein('carrot', 'carrrott'); // 2 (需插入 2 個 r)
echo levenshtein('kitten', 'sitting'); // 3
// 進階:自定義插入/替換/刪除代價
echo levenshtein('abc', 'ac', 1, 2, 1); // 替換代價 2,總距離 2
場景: 搜索建議「您是否想找...」、拼寫糾錯、模糊匹配去重、DNA 序列比對。
$a = 1; $b = 'test'; $c = [1,2];
$vars = get_defined_vars();
// 包含 $a, $b, $c 及所有超全局變量 ($_GET, $_POST, $GLOBALS 等)
// 調試神器:var_dump(array_keys(get_defined_vars()))
場景: 斷點調試、模板引擎變量提取、動態作用域分析。
ignore_user_abort(true); // 即使用戶關閉瀏覽器,腳本繼續跑完
// 配合 set_time_limit(0) 實現長時間後台任務
// 如:視頻轉碼、大數據導出、郵件隊列發送
注意: 仍受 max_execution_time 限制,需配合 set_time_limit(0)。
// 字符串高亮
highlight_string('');
// 返回高亮 HTML 字符串(第二參數 true)
$html = highlight_string('', true);
// 文件高亮
highlight_file(__FILE__); // 直接輸出
// 返回字符串
$html = highlight_file('config.php', true);
場景: 代碼分享平台、在線 IDE、文檔生成、錯誤頁面代碼片段展示。
$clean = php_strip_whitespace('source.php');
// 刪除所有註釋、空格、換行、制表符
// 保留 PHP 標簽、字符串字面量內的空白
// 用於代碼混淆預處理、體積分析、授權文件生成
// 需 php.ini 配置 browscap 指向最新 browscap.ini
$browser = get_browser(null, true); // 返回關聯數組
echo $browser['browser']; // Chrome
echo $browser['version']; // 120.0.0
echo $browser['platform']; // Windows 10
echo $browser['is_mobile']; // false
echo $browser['css_version']; // 3
場景: 兼容性降級、移動端適配、統計分析、功能開關。
echo "初始: " . memory_get_usage() . " bytes\n"; // 356 KB
$data = str_repeat('x', 10*1024*1024); // 10MB 字符串
echo "峰值: " . memory_get_peak_usage() . " bytes\n"; // 10.4 MB
unset($data);
echo "釋放後: " . memory_get_usage() . " bytes\n"; // 356 KB
場景: 內存洩漏排查、大數據處理優化、性能基準測試。
$ru = getrusage();
echo "用戶態 CPU: " . ($ru['ru_utime.tv_sec'] + $ru['ru_utime.tv_usec']/1e6) . "s\n";
echo "內核態 CPU: " . ($ru['ru_stime.tv_sec'] + $ru['ru_stime.tv_usec']/1e6) . "s\n";
echo "最大駐留集: " . $ru['ru_maxrss'] . " KB\n"; // Linux 為 KB
注意: Windows 不支持,僅 Unix/Linux/macOS 有效。
$original = "Lorem ipsum dolor sit amet... (長文本)";
$compressed = gzcompress($original, 9); // 級別 0-9,默認 6
echo "壓縮率: " . round((1 - strlen($compressed)/strlen($original))*100, 1) . "%\n"; // ~70%
$decompressed = gzuncompress($compressed);
assert($decompressed === $original);
場景: 緩存大對象、數據庫存儲長文本、網絡傳輸壓縮、Session 數據壓縮。
相關: gzencode()/gzdecode() (gzip 格式含頭尾)、gzdeflate()/gzinflate() (原始 zlib)。
$load = sys_getloadavg(); // [1min, 5min, 15min]
echo "1分鐘負載: $load[0], 5分鐘: $load[1], 15分鐘: $load[2]\n";
// 過載保護:負載 > CPU 核心數 * 2 時拒絕新任務或降級服務
場景: 自適應限流、佇列消費者動態擴縮容、健康檢查端點。
| 函數 | 核心能力 | 典型場景 | 注意事項 |
|---|---|---|---|
| levenshtein | 編輯距離 | 模糊搜索、去重 | 僅 ASCII,多字節需 mb_* 替代 |
| get_defined_vars | 作用域快照 | 調試、模板 | 包含超全局,體積大 |
| ignore_user_abort | 後台持久化 | 長任務 | 需配合 set_time_limit(0) |
| highlight_string/file | 語法高亮 | 代碼展示 | 輸出 HTML,需 CSS 配合 |
| php_strip_whitespace | 代碼壓縮 | 混淆、分析 | 保留字符串內空白 |
| get_browser | UA 解析 | 兼容性、統計 | 需更新 browscap.ini |
| memory_get_usage | 內存統計 | 性能優化 | 實際分配 > 邏輯大小 |
| getrusage | CPU 統計 | 性能分析 | Windows 不支持 |
| gzcompress | 字符串壓縮 | 緩存、傳輸 | 級別 9 最慢但最小 |
| sys_getloadavg | 系統負載 | 自適應限流 | 僅 Unix 系統 |
善用這些「冷門」函數,往往能用幾行代碼解決原本需引入庫或寫幾十行邏輯的問題。