許多開發者在安裝 PHP 時,面對「Thread Safe (TS)」與「Non Thread Safe (NTS)」兩種版本感到困惑。直覺以為「安全」較好,實則不然。本文深入剖析 PHP 線程安全機制原理,並依據主流運行模式(LNMP、LAMP)給出明確選擇建議。
PHP 核心採用單線程設計,所謂「線程安全」並非指 PHP 內部執行緒同步,而是針對多線程 SAPI 環境下的資源競爭提供保護。當 PHP 嵌入多線程 Web 伺服器(如 Apache Worker MPM)運行時,全域變數、擴展模組的共享資源若無同步機制,極易導致資料競爭、記憶體損毀甚至進程崩潰。TS 版本透過 TSRM (Thread Safe Resource Manager) 機制,為每個執行緒分配獨立資源副本,確保線程間隔離。
PHP-FPM 採用多進程模型,每個 Worker 進程擁有獨立記憶體空間,進程間天然隔離,無共享資源競爭問題。此架構下:
Apache 提供兩種 MPM (Multi-Processing Module):
| MPM 模式 | 架構 | PHP 版本建議 | 說明 |
|---|---|---|---|
| Prefork (預設/推薦) | 多進程 | NTS | 進程隔離,無需線程安全;穩定性最高,為 Linux 下主流部署方式。 |
| Worker / Event | 多線程 | TS | 僅此模式需 TS 版本,但 Linux 生產環境極少使用,因第三方模組相容性差、除錯困難。 |
官方文件明確指出:TS 版本會額外消耗 5%-15% CPU 資源,且因引入複雜的鎖機制,增加了死鎖、資源洩漏等潛在不穩定因素。除非確定運行於多線程 SAPI,否則一律選擇 NTS 版本是最佳實踐。
httpd -V | grep MPM,若為 Prefork → NTS總結:Linux 生產環境 99% 情況下應選擇 NTS 版本。僅在 Windows Apache 或特殊多線程嵌入場景才需 TS。安裝前確認 SAPI 架構,避免為「安全」之名付出效能與穩定性代價。