「Access Violation」是 PHP 在 Windows (IIS/Apache) 下最令人頭疼的錯誤之一,表現為進程崩潰、500 錯誤、事件查看器記錄 php-cgi.exe 或 httpd.exe 異常退出。官方 Bug 追蹤超過 11 個版本未徹底修復。本文基於多年維護經驗,總結七大成因與對應方案。
現象: 安裝 eAccelerator/APC/XCache 後隨機崩潰。
根因: 這類擴展在 Unix 下開發,依賴共享內存機制;Windows 缺乏同等的 shm 支持,導致內存訪問越界。
方案:
; php.ini 中註釋掉所有 opcode 緩存擴展
; zend_extension_ts="C:\php\extensions\eaccelerator_win_xxx.dll"
; eaccelerator.shm_size="16"
; ... 所有 eaccelerator.* 配置
; extension=php_apc.dll
; extension=php_xcache.dll
若必須用緩存,建議:
方案: 在 php.ini 明確設置有效路徑,並賦予 Everyone 完全控制權限 (相當於 0777):
session.save_path = "C:\Windows\Temp"
; 或專用目錄
session.save_path = "C:\php\sessions"
確保目錄存在且 IIS_IUSRS / IUSR / 用戶組有讀寫權限。
PHP 上傳、會話、緩存均依賴系統 Temp 目錄。同成因二,賦予完全控制權限。
memory_limit 設置,避免單腳本耗盡內存。穩定組合 (歷史參考):
嚴格按官方兼容性矩陣選版本,切勿混用。
應用池屬性 → 「性能」/「回收」/「健康」頁籤:
大量實測證明:調整應用池參數可解決 80%+ 的 Win2003+IIS6 Access Violation。
; 必須取消註釋並設置有效絕對路徑
upload_tmp_dir = "C:\Windows\Temp"
session.save_path = "C:\Windows\Temp"
; session.cookie_path = "/" (通常保持默認)
目錄需存在且有寫入權限。
upload_tmp_dir、session.save_path、系統 Temp 目錄權限。Access Violation 本質是 C 層面的非法內存訪問,PHP 代碼層面難以捕獲。系統級排查 + 環境優化是唯一出路。