環境:Win2003 + IIS6 + PHP 5.2.6 (ISAPI) + MySQL 5.0.51a + Zend 3.3a
瀏覽器顯示 「記憶體位置存取無效」,IIS 事件檢視器無明確錯誤,重啟應用程式集區無效。
; php.ini
display_startup_errors = On
重啟 IIS 後,瀏覽器終於顯示真實錯誤:
Warning: Cannot load module 'SQLite' because required module 'pdo' is not loaded in Unknown on line 0
php.ini 啟用了 extension=php_sqlite.dllextension=php_pdo.dll 被註解 (;extension=php_pdo.dll); php.ini
extension=php_pdo.dll ; 取消註解,優先載入
extension=php_sqlite.dll ; 之後才能載入 SQLite
; 如需 SQLite 3
extension=php_pdo_sqlite.dll
存檔 → 重啟 IIS 應用程式集區 → 錯誤消失,phpinfo() 正常顯示。
| 技巧 | 適用場景 | 操作 |
|---|---|---|
| 開啟 display_startup_errors | 模組載入失敗、早期致命錯誤 | php.ini 設 On,重啟 Web Server |
| 查看 Windows 事件檢視器 | ISAPI/CGI 崩潰、系統級錯誤 | 應用程式/系統日誌 → 來源 PHP/PHP-ISAPI |
| 命令列執行 php -m | 檢查模組載入狀態 | CLI 執行,對比 php.ini 設定 |
| 命令列執行 php -v | 版本資訊、載入錯誤即時顯示 | |
| 檢查 extension_dir 路徑 | 找不到 .dll/.so | php.ini 確認絕對路徑,檔案實際存在 |
| 依賴順序調整 | 模組間有相依 (PDO→SQLite, GD→FreeType 等) | php.ini 依賴在前,被依賴在後 |
| 權限檢查 | DLL/so 無法讀取 | IIS_IUSRS/IUSR 讀取權限、執行權限 |
| VC Runtime 版本匹配 | PHP 7+ 需對應 VC Redist | 安裝正確版本 (VC14, VC15, VS2019 等) |
| 錯誤日誌集中化 | 生產環境 | error_log 指定檔案,log_errors=On |
php-cgi.exe。「記憶體位置存取無效」往往是**嚴重錯誤的通用掩飾**。關鍵在於開啟啟動錯誤顯示、查看事件檢視器、檢查模組載入順序與相依性。本案例中,缺少 PDO 核心導致 SQLite 載入失敗 是典型模組相依衝突。生產環境建議遷移至 PHP-FPM + Nginx/IIS FastCGI,並建立完善的錯誤日誌與監控體系,將排查時間從小時壓縮至分鐘。