透過調整右側限制來清除 Nextcloud OPcache 警告

若要清除 Nextcloud 的「PHP OPcache 設定不正確」警告,請在「管理設定」→「概覽」中展開完整警告,然後僅增加 Web 伺服器使用的 PHP 配置中該警告所指示的 OPcache 限制。重新啟動對應的 PHP 服務並再次檢查警告;僅編輯命令列 PHP 配置可能不會更改 Nextcloud 使用的配置。

例如,如果 Nextcloud 報告字串緩衝區即將滿,opcache.interned_strings_buffer當伺服器記憶體充足時,將緩衝區大小從 16 MB 提高到 32 MB 是一個合理的初步調整。而關於快取腳本或共享記憶體的其他警告則需要不同的設定。

Nextcloud 為什麼會顯示此 OPcache 警告

OPcache 將編譯後的 PHP 字節碼儲存在共享記憶體中,從而減少重複 Web 請求所需的編譯量。它還為字串駐留預留空間,使 PHP 能夠重複使用相同的字串。這些容量是相互獨立的限制,因此增加其中一個容量並不一定能解決另一個容量不足的問題。

根據Nextcloud 35 伺服器調優文檔,當 OPcache 大小限制超過其分配容量的 90% 時,管理面板會發出警告。該訊息可能會具體提及字串緩衝區幾乎已滿、快取腳本數量有限或共享記憶體不足等問題。具體細節決定了修復方案。

Nextcloud 也需要opcache.save_comments=1OPcache 擴展,因為它依賴保留的 PHP 程式碼註解。因此,停用 OPcache 擴充或停用註解保留是配置問題,而不僅僅是快取大小問題。

1. 確定需要關注的環境

以管理員身分登錄,導覽至「管理設定」→「概覽」,並閱讀完整的 OPcache 警告。如果警告中包含指令名稱,請記錄其確切名稱。不要想當然地認為每個 OPcache 警告都意味著字串緩衝區大小不足。

  • 內部字串緩衝區幾乎已滿:檢查opcache.interned_strings_buffer。
  • OPcache 共享記憶體幾乎已滿:檢查opcache.memory_consumption。
  • 快取的腳本或鍵接近限制:檢查opcache.max_accelerated_files。
  • OPcache 已停用或註解未保留:請檢查opcache.enable並opcache.save_comments。

2. 找到執行 Nextcloud 的 PHP 配置

在使用 PHP-FPM 的 Debian 或 Ubuntu 伺服器上,PHP 配置通常會依照 PHP 版本和伺服器 API 進行組織。例如,PHP 8.3 FPM 可能會讀取 `/etc/php/php/` 目錄下的文件/etc/php/8.3/fpm/conf.d/,而 Apache 的 PHP 模組可能使用 `/etc/php/php/`目錄下的文件/etc/php/8.3/apache2/conf.d/。

若要查看 systemd 主機上存在哪些 PHP-FPM 服務,請執行:

systemctl list-units --type=service 'php*-fpm.service'

檢查適用的 OPcache 文件,並將文件名稱替換為您已安裝的 PHP 版本:

sudo ls -l /etc/php/8.3/fpm/conf.d/*opcache*
sudo grep -R 'opcache\.' /etc/php/8.3/fpm/conf.d/

如果未找到任何文件,請檢查php.ini發行版的根目錄和打包規格。此指令php --ini可用於識別CLI PHP 配置,但 CLI 和 PHP-FPM 可能會載入不同的設定。

對於 Docker 或 Nextcloud All-in-One,請檢查Nextcloud 容器內的PHP 配置,並使用支援的持久化配置方法。編輯 hosts/etc/php檔案通常不會設定容器內的 PHP;編輯產生的容器檔案也可能會因重新產生容器檔案而撤銷。

3. 在不更改無關設定的情況下,提高報告限制

在進行任何更改之前,請備份相關的設定檔。在標準的 Debian/Ubuntu PHP-FPM 安裝中,一種可行的方法是在該 PHP 版本的 FPMconf.d目錄下新增一個本地覆蓋檔案。在繼續操作之前,請確認您的 PHP-FPM 安裝已載入此目錄。

對於字串緩衝區範例,建立或編輯本機覆蓋,例如/etc/php/8.3/fpm/conf.d/99-nextcloud-opcache.ini:

; Example for a warning about interned strings
opcache.interned_strings_buffer=32

這裡32指的是 32 MB,而不是 32 個位元組。最終值應根據實際使用量和可用記憶體確定。

如果警告中提到的是其他限制,請使用相應的範例,而不是盲目地將三個限制全部添加:

; Example only: larger shared bytecode cache
opcache.memory_consumption=256

; Example only: allow more cached script keys
opcache.max_accelerated_files=20000

的值opcache.memory_consumption以兆位元組 (MB) 為單位,而 則opcache.max_accelerated_files指定腳本鍵限制。官方的 PHP OPcache 配置參考文件解釋了它們的單位、預設值和可修改性。

如果警告訊息指向的是已停用的 OPcache 或缺少註解而不是容量問題,請檢查以下設定:

opcache.enable=1
opcache.save_comments=1

請勿為了忽略此警告而關閉opcache.validate_timestamps或大幅延長快取時間opcache.revalidate_freq。 Nextcloud 提醒您,延遲快取重新驗證可能會導致設定和升級變更無法及時生效。

4. 應用新配置

例如,對於執行 PHP 8.3 並透過 PHP-FPM 運行的伺服器,首先驗證服務配置,然後在短暫的維護視窗期內重新啟動相應的服務:

sudo php-fpm8.3 -t
sudo systemctl restart php8.3-fpm

請將 PHP-FPM 版本替換8.3為已安裝的版本,並在執行任一指令前確認執行檔和服務名稱。重啟會中斷該服務池處理的請求。對於 Apache 伺服器mod_php,相關的服務是 Apache 而非 PHP-FPM;對於容器,請依照部署文件中記錄的重新啟動或重建流程操作,同時保留設定。

如果服務無法重啟,請恢復備份的設定並檢查 PHP-FPM 或 Web 伺服器錯誤日誌。

5. 如果警告仍然存在,請檢查有效的 Web PHP 設定

首先,在 PHP 工作進程重新啟動後,重新載入「管理設定」→「概覽」。如果警告仍然存在,請確認更改的指令是否已由Web PHP 運行時加載,而不僅僅是 CLI 加載。檢查是否存在稍後加載的.ini檔案或 PHP-FPM 池覆蓋設置,導致您的值被覆蓋。

在您控制的伺服器上,您可以使用權限受限的診斷端點和 PHPini_get()函數暫時檢查 Web PHP 值。切勿將公開phpinfo()頁面留在線上:這可能會洩漏環境、路徑、模組和其他敏感設定資訊。驗證完成後,請立即移除所有診斷端點。

若要持續收到快取大小警報,請檢查正常流量下實際的 OPcache 使用情況,而不是重複將數值加倍。 PHP文件描述opcache_get_status()了正在運行的 PHP 進程可用的記憶體、字串駐留和腳本快取統計資訊。

Nextcloud 的官方 Docker 映像和 All-in-One 部署都帶有各自的 PHP 預設配置;請勿假設主機層級的修改或其他安裝建議的值會保留。請參考Nextcloud 官方 Docker 倉庫或All-in-One 官方倉庫,尋找與您的部署相符的設定模型。

確認修復是否有效

返回「管理設定」→「概覽」,確認 OPcache 警告已消失。打開並重新載入幾個 Nextcloud 頁面,確保應用程式回應正常。如果正常使用後警告再次出現,請重新檢查相同的限制值和有效的 Web PHP 配置;目標是在不為 OPcache 分配不必要記憶體的情況下,留出足夠的記憶體餘裕。

留下評論

使用定時佇列來控制 Nextcloud 預覽版 CPU 峰值

將縮圖製作移至受控的後台計劃,修剪未使用的預覽尺寸,並在不使 Nextcloud 伺服器過載的情況下驗證佇列。

取得 Nextcloud 桌面同步功能,擺脫「處理文件」的束縛

找到導致 Nextcloud 同步失敗的檔案、排除規則、連線問題或用戶端資料庫狀態,然後安全地驗證上傳和下載。

透過調整右側限制來清除 Nextcloud OPcache 警告

找到觸發 Nextcloud 警告的 PHP OPcache 限制,更新正確的 Web PHP 配置,安全重啟,並驗證結果。

將 Nextcloud 連接到 CODE Docker:設定和權衡

將 Nextcloud 連接到 CODE Docker:設定和權衡

比較內建程式碼和基於 Docker 的程式碼,然後透過安全的 HTTPS 反向代理將 Collabora Online 連接到 Nextcloud。

使用 Galera 建構彈性 Nextcloud 集群

規劃一個可靠的 Nextcloud 高可用性部署,包括共用儲存、Redis 鎖定、支援仲裁的 MariaDB 路由和實用的故障轉移檢查。

當直接媒體傳輸失敗時,如何透過 Nextcloud Talk 進行通話

當直接媒體傳輸失敗時,如何透過 Nextcloud Talk 進行通話

當防火牆或限制性 NAT 阻止直接呼叫媒體時,配置並驗證 Nextcloud Talk 的可達 TURN 中繼。

透過恢復正確的檔案清除 Nextcloud 完整性警告

使用無效文件報告來識別已更改、缺失或多餘的 Nextcloud 程式碼,安全地恢復受信任的文件,並驗證結果。

使用 OAuth2 將 Gmail 或 Microsoft 365 連接到 Nextcloud Mail

使用 Gmail 或 Microsoft 365 為 Nextcloud Mail 設定 OAuth2,驗證接收和傳送,並解決常見的同意和 SMTP 失敗問題。

使用 OCC 安全清除卡住的 Nextcloud 維護模式

使用 OCC 安全清除卡住的 Nextcloud 維護模式

使用 OCC 還原 Nextcloud 存取權限,驗證資料庫遷移狀態,並為歸檔、Docker 或 Snap 安裝選擇正確的命令。

設定 Nextcloud LDAP 和 Active Directory 登入

將 Nextcloud 連接到 LDAP 或 Active Directory,使用使用者和群組過濾器限制訪問,並在部署前驗證安全性驗證。