Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> 電腦軟體教學 >> 伺服器技術 >> 關於伺服器

解決 Windows 事件檢視器「Zend Optimizer Event ID 487/5」錯誤:Temp 目錄權限修復全攻略

編輯:關於伺服器

錯誤現象

Windows 事件檢視器 → 系統/應用程式 日誌中反覆出現:

  • Event ID 487 (Source: Zend Optimizer):`Unable to view file mapping, 試圖訪問無效的地址`
  • Event ID 5 (Source: Zend Optimizer):`Unable to write base address, 拒絕訪問`、`C:\WINDOWS\TEMP\ZendOptimizer.MemoryBase@NETWORK SERVICE, 拒絕訪問`

伴隨 PHP 應用間歇性 500 錯誤、效能下降、Zend 加速失效。

根因分析

Zend Optimizer 需在 **暫存目錄** 建立共享記憶體對應檔 (`ZendOptimizer.MemoryBase@<用戶>`) 以進行程式碼快取與優化。若執行 PHP 的身分 (IIS_IUSRS / IUSR / NETWORK SERVICE / 應用程式池身分) **無寫入權限**,即記錄上述事件並降級運行 (不加速)。

完整修復步驟

1. 確認實際暫存目錄位置

查看 `php.ini`:

upload_tmp_dir = "C:\Windows\Temp"
; 或
session.save_path = "C:\Windows\Temp"
; 若未設定,預為 %TEMP% / %TMP% 環境變數指向

**關鍵:** 以 **PHP 實際執行身分** 為準,非預設 `C:\Windows\Temp`。

2. 給予寫入權限 (核心修復)

  1. 以總管開啟暫存目錄 (如 `C:\Windows\Temp`)。
  2. 右鍵 → 內容 → **安全性** → **編輯** → **新增**。
  3. 輸入物件名稱 (按需新增,**至少包含**):
    • `IIS_IUSRS` (IIS 7+ 預設應用程式池群組)
    • `IUSR` (匿名存取身分)
    • `NETWORK SERVICE` (舊版/特定身分)
    • **應用程式池自訂身分** (若網站用 `ApplicationPoolIdentity` 以外帳號)
  4. 權限勾選:**修改** (含寫入、刪除、讀取) → 確定套用。
  5. **遞迴套用** 至子資料夾/檔案。

3. 確保對應檔案存在 (可選)

若目錄下缺少 `ZendOptimizer.MemoryBase@SYSTEM`、`ZendOptimizer.MemoryBase@NETWORK SERVICE`,手動建立空白檔案並給予相同權限:

type nul > "C:\Windows\Temp\ZendOptimizer.MemoryBase@SYSTEM"
type nul > "C:\Windows\Temp\ZendOptimizer.MemoryBase@NETWORK SERVICE"
icacls "C:\Windows\Temp\ZendOptimizer.MemoryBase@" /grant "IIS_IUSRS:(M)" "IUSR:(M)" "NETWORK SERVICE:(M)"

4. 明確指定 php.ini 暫存路徑 (避免環境變數不穩)

; php.ini
upload_tmp_dir = "C:\PHP\Temp"
session.save_path = "C:\PHP\Temp"
; 建立 C:\PHP\Temp 並給予上述權限,隔離系統 Temp,更安全可控

5. Zend Optimizer 安裝目錄權限 (補充)

確保 `C:\Program Files\Zend\ZendOptimizer-<版本>\lib\` (或安裝路徑) 給予 `IIS_IUSRS`、`IUSR` **讀取與執行** 權限。

6. 終極方案:IIS 5.0 隔離模式 (僅 IIS 6.0 / Server 2003)

若上述均無效,啟用 IIS 5.0 相容模式:

  1. IIS 管理員 → 網站 → 內容 → **主目錄** → **應用程式保護** → 選 **高 (獨立處理序)** (IIS 5.0 隔離模式)。
  2. 重啟 IIS。

此模式每網站獨立進程,權限邊界清晰,但**資源消耗大、不支援 IIS 7+**。

驗證修復

  1. 重啟 IIS (`iisreset`)。
  2. 觀察事件檢視器 10 分鐘,確認 **不再出現 Event ID 487/5**。
  3. PHP `phpinfo()` 頁面檢查 Zend Optimizer 區塊顯示 **Enabled** 且版本正確。
  4. 壓力測試 `ab -n 1000 -c 50` 確認無 500 錯誤、回應時間正常。

現代替代:棄用 Zend Optimizer,改用 OPcache

PHP 5.5+ 內建 **OPcache**,效能更強、零配置衝突、無權限困擾:

; php.ini (PHP 5.5+)
zend_extension=opcache.so  ; Windows: php_opcache.dll
opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=20000
opcache.revalidate_freq=60
opcache.fast_shutdown=1

強烈建議 PHP 5.3/5.4 專案規劃升級至 PHP 7.4+/8.x,徹底解決 Zend Optimizer 歷史包袱。

總結

Zend Optimizer 事件錯誤 **99% 為暫存目錄寫入權限不足**。按順序:確認實際 Temp 路徑 → 給 `IIS_IUSRS`/`IUSR`/`NETWORK SERVICE` 修改權限 → 明確指定 `upload_tmp_dir` → 驗證事件日誌清靜。長期請遷移 OPcache。

Copyright © Windows教程網 All Rights Reserved