版本矩陣速查
| 組合 | Web Server | 運行模式 | 適用場景 |
| VC6 + Thread Safe | Apache | mod_php (ISAPI/Handler) | 傳統 Apache 2.0/2.2 模塊模式 |
| VC6 + Non Thread Safe | Apache | FastCGI (mod_fcgid/php-fpm) | Apache + FastCGI 架構 |
| VC9 + Thread Safe | IIS 6/7+ | ISAPI | IIS 6 ISAPI 模塊、IIS 7+ 模塊模式 |
| VC9 + Non Thread Safe | IIS 7+ | FastCGI | **推薦**:IIS 7+ 官方支援模式、PHP 官方構建 |
核心概念解析
VC6 vs VC9:編譯器差異
- VC6:Visual Studio 6 (1998) 編譯,舊 ABI,與 Apache 官方 Windows 構建(同樣 VC6)二進制兼容。
- VC9:Visual Studio 2008 (VC9) 編譯,新 ABI,優化現代 CPU 指令集,與 IIS 官方環境兼容。
- 關鍵規則:PHP 編譯器必須與 Web Server/SAPI 綁定的運行庫一致,否則載入擴展(php_*.dll)會發生運行時崩潰或「Unable to load dynamic library」。
Thread Safe (TS) vs Non Thread Safe (NTS)
| 特性 | Thread Safe | Non Thread Safe |
| 線程安全檢查 | 啟用(TSRM 層) | 禁用 |
| 性能開銷 | 略高(鎖、線程局部存儲) | 較低(無鎖) |
| 適用 SAPI | 多線程 SAPI:Apache mod_php (Worker MPM)、IIS ISAPI | 單線程 SAPI:CLI、FastCGI (php-fpm、mod_fcgid)、CGI |
| 擴展兼容性 | 所有官方擴展均提供 TS 版 | 部分第三方擴展僅提供 TS 版,需自行編譯 NTS |
決策流程圖(文字版)
開始
│
├─ Web Server 是 Apache?
│ ├─ 是 → 運行模式?
│ │ ├─ mod_php (Handler/ISAPI) → 選 VC6 Thread Safe
│ │ └─ FastCGI (mod_fcgid/php-fpm) → 選 VC6 Non Thread Safe
│ └─ 否 → 是 IIS?
│ ├─ IIS 6 / IIS 7 ISAPI 模塊 → 選 VC9 Thread Safe
│ └─ IIS 7+ FastCGI (標準) → 選 VC9 Non Thread Safe **(官方推薦)**
│
└─ CLI 腳本/獨立運行 → 任意 NTS 版本(推薦 VC9 NTS,性能最佳)
常見坑點
- 混用 VC6/VC9 擴展:從 PECL 下載擴展時必須匹配 PHP 包的 VC 版本與 TS/NTS 標識(文件名含
vc9_nts、vc6_ts 等)。
- Apache 2.4 + VC6:Apache 2.4 官方 Windows 構建已改用 VC11,搭配 VC6 PHP 可能不穩定。生產環境建議遷移至 Apache 2.4 VC15/VC16 + PHP 7.x/8.x VC15/VC16 NTS (FastCGI)。
- Thread Safe 用於 FastCGI:雖能運行,但無意義的鎖開銷降低吞吐;反之 NTS 用於 mod_php 會導致線程衝突崩潰。
- php.ini 中
extension_dir 路徑錯誤:確保指向對應版本的 ext/ 目錄,且擴展 DLL 文件實際存在。
現代環境建議(2024+)
- Windows 生產環境:優先 IIS 10 + PHP 8.x VC15 NTS (FastCGI) 或 Nginx + PHP-FPM (WSL2/Linux 容器)。
- 開發環境:Docker 容器(
php:8.3-apache / php:8.3-fpm)一致性最高,避免 Windows 原生編譯器地獄。
- 歷史項目維護:若必須在 Windows 運行 PHP 5.3,嚴格遵循上表矩陣,並鎖定具體構建版本(如
php-5.3.29-Win32-VC9-x86.zip)。
驗證當前運行模式
<?php
echo "PHP Version: " . PHP_VERSION . "\n";
echo "Compiler: " . (strpos(PHP_VERSION, 'VC') ? 'MSVC' : 'Other') . "\n";
echo "Thread Safety: " . (ZEND_THREAD_SAFE ? 'Enabled (TS)' : 'Disabled (NTS)') . "\n";
echo "SAPI: " . PHP_SAPI . "\n";
// 輸出示例:
// PHP Version: 5.3.29
// Compiler: MSVC
// Thread Safety: Disabled (NTS)
// SAPI: cgi-fcgi
?>