memory_limit、date.timezone、擴充套件組合PHP 啟動時按優先級查找 php.ini:
PHPIniDir、IIS 註冊表 IniFilePath)PHPRCC:\Windows)關鍵洞察:將 php.ini 放置於 PHP 執行檔同目錄,優先級高於系統目錄,可實現「一套 PHP 一份配置」的物理隔離。
C:\php56 (自訂路徑,避免預設 C:\php)php.ini 到 C:\WindowsC:\Windows\php.ini 複製到 C:\php56\php.iniC:\php56\php -i | findstr "Loaded Configuration File" → 應顯示 C:\php56\php.iniC:\php56\php.ini:啟用 IonCube、設定專案專用參數D:\php74 (磁碟隔離避免路徑衝突)php.ini 複製到 C:\Windows (覆蓋無妨)C:\Windows\php.ini 複製到 D:\php74\php.iniD:\php74\php -i | findstr "Loaded Configuration File" → D:\php74\php.iniD:\php74\php.ini:啟用 Zend Guard、OPcache、專案參數同理安裝至 E:\php82,複製 php.ini 至安裝目錄,獨立配置。
.php 對應:可執行檔指向 C:\php56\php5isapi.dllD:\php74\php7isapi.dll
| 隔離層級 | 配置方式 | 優勢 |
|---|---|---|
| 站點級 | 不同站點綁定不同 FastCGI 應用程式 | 配置簡單,共用應用程式池 |
| 應用程式池級 (推薦) | 每站點獨立應用程式池,各自綁定專屬 PHP-CGI | 進程完全隔離、資源配額獨立、崩潰不波及、安全性最高 |
AppPool_PHP56、AppPool_PHP74、AppPool_PHP82php-cgi.exe 建立獨立應用程式,設定 instanceMaxRequests、activityTimeout 等| 指標 | 單套 PHP | 三套共存 | 說明 |
|---|---|---|---|
| 記憶體 (閒置) | ~30 MB | ~95 MB | 每套獨立進程池,基線約 30MB |
| CPU (閒置) | 0% | 0% | 無流量無佔用 |
| 啟動延遲 | ~200ms | 各自獨立 | 首次請求觸發啟動 |
結論:現代伺服器 (8GB+ RAM) 運行 3-5 套 PHP 完全無壓力。關鍵在應用程式池隔離防止記憶體洩漏互相影響。
| 坑點 | 後果 | 規避 |
|---|---|---|
| 忘記複製 php.ini 到安裝目錄 | 讀取 C:\Windows 舊配置,加密模組衝突 | 安裝後必做:複製並驗證 Loaded Configuration File |
| 多版本共用 C:\Windows\php.ini | 配置互相覆蓋,極難排查 | 物理隔離:每版本獨立 php.ini |
| ISAPI 模式混用多版本 | 單進程無法載入多版本 ISAPI DLL | ISAPI 僅支援單版本,多版本必須用 FastCGI |
| FastCGI 未設 instanceMaxRequests | 長期運行記憶體洩漏無回收 | 設定 1000-5000,定期重啟進程 |
| 擴充套件 DLL 版本不匹配 | PHP 啟動失敗、功能缺失 | 嚴格對應 PHP 版本、TS/NTS、VC 編譯版本 |
phpinfo() 確認 PHP 版本、Loaded Configuration File、載入模組Windows Server 多 PHP 共存的核心是 「安裝目錄隔離 + php.ini 就地化 + IIS 應用程式池綁定」 三步走。避開 ISAPI 限制,擁抱 FastCGI + 應用程式池隔離,即可在單機穩定運行 PHP 5.6 / 7.4 / 8.2 多版本環境,完美解決 IonCube/Zend Guard 互斥、版本鎖定、配置衝突等歷史難題,為舊專案維護與新架構遷移賏爭寶貴緩衝期。