首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

IIS 6 + PHP 最佳實踐:ISAPI 模式部署、環境變數隔離、零停機熱升級架構

     編輯:PHP 綜合知識

為什麼選 IIS 6 + PHP ISAPI?

在 Windows Server 2003 時代,若需同一台主機同時支援 **PHP、ASP、ASP.NET、JSP、Perl**,IIS 6 是唯一原生選擇。雖然 FastCGI (PHP 5.3+) 效能更好、穩定性更高,但 ISAPI 在舊版 PHP (4.x/5.2) 上仍是主流。本文建立一套 **「配置一次、升級零接觸系統目錄、熱切換版本」** 的最佳實踐架構。

核心設計原則

  1. PHP 完全隔離在單一目錄 (預設 `C:\PHP5`),**不複製任何 DLL 到 `System32`**。
  2. 系統 `Path` 環境變數指向 PHP 目錄**,確保 CLI、ISAPI、CGI 共用同一組二進位檔。
  3. php.ini 放在 `C:\Windows\`** (IIS 6 ISAPI 掃描順序),但實際可讀寫路徑由 `PHPRC` 環境變數覆蓋 (進階)。
  4. 升級 = 刪除舊目錄 + 解壓新版 + `iisreset`**,無需重新註冊 ISAPI、無需動註冊表。

部署步驟標準化 SOP

1. 準備與解壓

# 假設系統盤 C:\
# 1. 下載 PHP 5.2.x Non Thread Safe (ISAPI 專用) 或 Thread Safe (視 SAPI) Zip 版
# 2. 解壓至 C:\PHP5
# 3. 解壓 PECL 擴展包至 C:\PHP5\ext\
# 4. 建立 C:\PHP5\session\ (給 IUSR_機器名 / IIS_WPG 寫入權限)

2. 環境變數 (關鍵:放在 Path **最前面**)

# 我的電腦 → 內容 → 進階 → 環境變數 → 系統變數 → Path → 編輯
# 在最前面插入 (分號分隔):
C:\PHP5;C:\PHP5\dlls;C:\PHP5\ext;C:\PHP5\sapi
# 確認:打開新 CMD 輸入 php -v 顯示正確版本

3. php.ini 生產環境模板 (C:\Windows\php.ini)

engine = On
short_open_tag = Off
asp_tags = Off
precision = 14
output_buffering = 4096
zlib.output_compression = Off
implicit_flush = Off
serialize_precision = 100
allow_call_time_pass_reference = Off
safe_mode = Off
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
disable_classes =
expose_php = Off
max_execution_time = 30
max_input_time = 60
memory_limit = 128M
error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
display_errors = Off
display_startup_errors = Off
log_errors = On
log_errors_max_len = 1024
error_log = "C:\PHP5\logs\php_error.log"
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
track_errors = Off
html_errors = Off
variables_order = "GPCS"
request_order = "GP"
register_argc_argv = Off
auto_globals_jit = On
post_max_size = 8M
auto_prepend_file =
auto_append_file =
default_mimetype = "text/html"
default_charset = "utf-8"
doc_root =
user_dir =
extension_dir = "C:\PHP5\ext"
enable_dl = Off
file_uploads = On
upload_max_filesize = 2M
max_file_uploads = 20
allow_url_fopen = On
allow_url_include = Off
default_socket_timeout = 60

[Date]
date.timezone = "Asia/Taipei"

[Pdo_mysql]
pdo_mysql.default_socket =

[mail function]
SMTP = localhost
smtp_port = 25
sendmail_from =

[SQL]
sql.safe_mode = Off

[Session]
session.save_handler = files
session.save_path = "C:\PHP5\session"
session.use_cookies = 1
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly = 1
session.cookie_secure = 0
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.bug_compat_42 = Off
session.bug_compat_warn = Off
session.referer_check =
session.entropy_length = 32
session.entropy_file = /dev/urandom
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.hash_function = 0
session.hash_bits_per_character = 5
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"

; === 擴展啟用 (視專案需求) ===
extension=php_mbstring.dll
extension=php_gd2.dll
extension=php_mysql.dll
extension=php_mysqli.dll
extension=php_pdo_mysql.dll
extension=php_curl.dll
extension=php_xmlrpc.dll
extension=php_zip.dll
extension=php_openssl.dll
; extension=php_bz2.dll
; extension=php_soap.dll
; extension=php_sockets.dll

[Zend]
zend_extension_manager.optimizer_ts = "C:\PHP5\ZendOptimizer\lib\Optimizer"
zend_extension_ts = "C:\PHP5\ZendOptimizer\lib\ZendExtensionManager.dll"
zend_optimizer.optimization_level = 1023

4. IIS 6 圖形介面配置 (三步走)

  1. Web 服務擴展 → 新增 → 「PHP ISAPI」 → 檔案:`C:\PHP5\sapi\php5isapi.dll` → 允許。
  2. 網站 → 內容 → ISAPI 篩選器 → 新增 → 篩選器名稱:`PHP` → 可執行檔:同 `php5isapi.dll`。
  3. 網站 → 內容 → 主目錄 → 配置 → 應用程式副檔名 → 新增 → 可執行檔:同 `php5isapi.dll` → 副檔名:`.php` → 動作:`GET,HEAD,POST` → 取消「檢查檔案是否存在」(讓 PHP 處理 404/URL Rewrite)。

完成後:**右鍵「本機電腦」→ 所有工作 → 重新啟動 IIS** (`iisreset`)。

5. 驗證

<?php phpinfo(); ?>

存為網站根目錄 `phpinfo.php`,瀏覽確認:

  • Server API: `ISAPI`
  • Configuration File Path: `C:\Windows`
  • Loaded Configuration File: `C:\Windows\php.ini`
  • 所有啟用擴展正常顯示

熱升級演練 (零配置變更)

# 1. 下載新版 PHP Zip (如 5.2.17 → 5.2.18)
# 2. 重命名舊目錄備份
move C:\PHP5 C:\PHP5_20240101_bak
# 3. 解壓新版至 C:\PHP5
# 4. 複製舊 php.ini 覆蓋新版 (或比對合併新增指令)
copy C:\PHP5_20240101_bak\php.ini C:\Windows\php.ini
# 5. 重啟 IIS
iisreset
# 6. 瀏覽 phpinfo.php 確認版本號更新
# 7. 運行自動化測試套件 / 關鍵業務冒煙測試
# 8. 確認無誤後刪除備份目錄

**全程不動 `System32`、不動註冊表、不重新配置 IIS 擴展/篩選器/映射**——因為它們都指向 `C:\PHP5\sapi\php5isapi.dll`,而新版解壓後同樣在這個路徑。

進階優化與安全強化

項目配置/操作
Zend Optimizer / Guard Loader安裝至 `C:\PHP5\ZendOptimizer\`,php.ini 載入 `zend_extension_ts`,`optimization_level=1023`
FastCGI 遷移 (PHP 5.3+)改用 `php-cgi.exe` + `FastCGI Extension for IIS 6.0`,效能提升 30-50%,支援 `php-fpm` 風格進程管理
應用程式集區隔離每站點獨立 AppPool,身分用專用帳號,`php.ini` 用 `PHPRC` 環境變數指向站點專屬配置
錯誤日誌集中化`error_log = syslog` 或統一寫入 `C:\PHP5\logs\`,配合 LogParser/ELK 分析
請求過濾 / URL Rewrite安裝 URL Rewrite Module 2.0 / IIS 6 專用 ISAPI_Rewrite,隱藏 `.php`、防 SQL 注入特徵
權限最小化網站目錄僅 `Read` + `Scripts` 執行權限,`upload/` 目錄單獨給 `Write` 且執行腳本禁用

常見故障速查

  • ISAPI 篩選器綠箭頭變紅:DLL 路徑錯誤、版本不符 (TS/ NTS 混用)、依賴 DLL 缺失 (用 Dependency Walker 診斷)。
  • 「指定的模組找不到」:`php5isapi.dll` 依賴 `php5ts.dll`、`libeay32.dll`、`ssleay32.dll` 等,**環境變數 Path 必須包含 `C:\PHP5` 且在最前面**。
  • 上傳檔案 > 2MB 失敗:同時調整 `php.ini: upload_max_filesize, post_max_size` + IIS `AspMaxRequestEntityAllowed` (Metabase)。
  • Session 丟失/衝突:多站點共用 `session.save_path` → 各站點設獨立 `session.name` 或 `session.save_path`。

結語

這套架構在 2005-2010 年支撐了無數中小型 Windows 虛擬主機與企業內部門戶。今天雖然 IIS 6 已停止支援、PHP 5.2 早已 EOL,但**「單一目錄隔離、Path 前置、配置外部化、升級即替換」** 的思想,完美映射到現代 **Docker 映像層、Kubernetes ConfigMap/Secret、藍綠部署、不可變基礎設施** 的核心邏輯。理解歷史最佳實踐,是掌握現代 DevOps 本質的捷徑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved