修正 ownCloud 10 中的「PHP 記憶體限制低於建議值」問題

你想要的結果不僅僅是「警告消失」。正確的修復方案意味著實際運行 ownCloud 10 的 PHP 進程報告的記憶體限制至少為 512 MB,ownCloud 管理員警告清除,計劃任務或 CLI 任務也使用適當的記憶體限制,並且主機仍然有足夠的實體記憶體來運行 PHP、Web 伺服器、資料庫和後台任務,而不會出現大量的記憶體交換。

對於 ownCloud Classic 10.16,官方 Docker 環境OWNCLOUD_MEMORY_LIMIT=512M建議使用預設配置。 ownCloud 的文檔也區分了 Web 伺服器使用的 PHP 配置和 使用的配置php-cli。正是由於這種區別,管理員有時即使更改了memory_limit並重啟了服務,仍然會看到相同的警告。

本指南首先介紹幹擾最小的檢查方法,然後展示 Apache、PHP-FPM、CLI 和 Docker 的路徑。此外,它還解釋了何時應該進一步提高限制,以及何時真正的問題是主機記憶體不足,而不是 PHP 設定本身的問題。

成功是什麼樣子

查看結果良好如果它失敗了
ownCloud 管理概覽沒有「PHP記憶體限制低於建議值」的警告您可能編輯了錯誤的 PHP 配置,或者沒有重新啟動正確的服務。
Web PHP 運行時memory_limit顯示 512M 或更高找到Web 請求使用的已載入設定檔。
CLI/cron運行時php -r 'echo ini_get("memory_limit");'顯示出預期價值php.ini同時編輯 CLI 特有的內容。
主機記憶體記憶體充足;幾乎沒有持續的交換壓力不要盲目地不斷提高 PHP 限制。請重新評估 PHP 工作進程數或主機容量。
紀錄未出現反覆出現的「允許的記憶體大小已用盡」錯誤在再次提高記憶體限制之前,請先找出消耗記憶體的工作負載。

1. 確認警告訊息以及ownCloud看到的值

ownCloud 10 管理員概覽顯示警告,指出 PHP 記憶體限制低於建議值,且限制為 128 MB。
首先,從ownCloud自身可見的值開始計算。 128 MB或256 MB的Web執行時間限制低於ownCloud建議的Docker配置所使用的512 MB值。

開啟 ownCloud 管理設置,注意記憶體限制警告。在進行任何變更之前,請記錄 ownCloud 版本、PHP 版本、Web 伺服器類型和目前記憶體限制。這可以作為基準,並有助於避免在安裝了多個 PHP 版本的系統上更改錯誤的 PHP 安裝。

ownCloud 10.16 版本的最新文件指出,伺服器需求很大程度上取決於使用者數量、文件數量和活動量。其 Docker 配置設定OWNCLOUD_MEMORY_LIMIT=512M建議保持預設值。因此,512 MB 是一個合理的基準值,可以用來解決警告問題,但並不能保證所有工作負載都能控制在 512 MB 以內。

官方參考資料:ownCloud 部署建議和ownCloud Docker 環境變數。

2. 不要相信命令列介面 (CLI) 的值能夠代表 Web 伺服器。

Ubuntu 終端機顯示 php -i 和 php --ini 命令,命令列記憶體限制為 128M,並顯示了命令列 php.ini 檔案的路徑。
php --ini報告 PHP CLI 的配置。這可能與 Apache 或 PHP-FPM 用於運行 ownCloud 的 PHP 配置不同。

執行以下命令,查看命令列 PHP 進程使用的命令:

php --ini
php -r 'echo ini_get("memory_limit"), PHP_EOL;'

這對於定時任務很有用occ,但並不能證明 Web 要求使用了什麼設定。 ownCloud 明確記錄了不同的配置路徑,例如:

/etc/php/<version>/apache2/php.ini
/etc/php/<version>/fpm/php.ini
/etc/php/<version>/cli/php.ini

如果您的 CLI 顯示 512M,而管理頁面仍然報錯,則這種不匹配強烈表明 Web 伺服器正在載入另一個php.ini。

請參閱ownCloud 的 PHP 配置說明,其中特別警告說,可能需要在多個 INI 檔案中更改 PHP 設定。

3. 尋找 Web 請求使用的 PHP 配置

瀏覽器 phpinfo 頁面顯示已載入的 PHP-FPM 設定文件,旁邊終端顯示 128M 記憶體限制,以及 CLI 設定資訊。
比較瀏覽器端 PHP 運行時和 CLI 運行時。瀏覽器中載入的設定檔是導致 ownCloud Web 警告的關鍵檔案。

最可靠的測試方法是檢查與 ownCloud 相同的 Web 架構中的 PHP 程式碼。 ownCloud 的文檔中描述如何使用臨時phpinfo.php頁面:

<?php phpinfo(); ?>

將其暫時放置在網站根目錄,在瀏覽器中打開,並找到:

  • 已載入設定檔
  • 記憶體限制
  • 伺服器 API

然後立即刪除phpinfo檔案。 ownCloud警告說,保留公開的phpinfo頁面會洩露敏感的伺服器資訊。

如果瀏覽器顯示/etc/php/7.4/fpm/php.ini「while php --inisays」/etc/php/7.4/cli/php.ini,現在您就知道為什麼編輯 CLI 檔案沒有清除警告了。

4. PHP-FPM:將 Web 執行階段限制提高到 512M

Nano 編輯器開啟了一個 PHP-FPM php.ini 文件,其中 memory_limit 設定為 512M。
對於使用 PHP-FPM 的 Nginx 或 Apache 設置,請變更 FPMphp.ini或適用的池/站點覆蓋,而不僅僅是 CLI 檔案。

在典型的 Debian 或 Ubuntu 安裝中:

sudo nano /etc/php/7.4/fpm/php.ini

尋找:

memory_limit = 128M

並將其更改為:

memory_limit = 512M

請在路徑中使用您已安裝的 PHP 版本。然後重新啟動對應的 FPM 服務和 Web 伺服器(如有必要):

sudo systemctl restart php7.4-fpm
sudo systemctl reload nginx

對於使用 Apacheproxy_fcgi或其他 FPM 設定的 Apache,請重新啟動 PHP-FPM 並重新載入 Apache。

ownCloud 也指出,PHP-FPM 不會使用來自 . 的 PHP 設定.htaccess。如果您依賴 FPM 的目錄覆蓋,請使用適用於您環境的受支援的 PHP/FPM 配置機制,例如相應的 . php.ini、池配置或.user.ini.

5. 使用 mod_php 的 Apache:編輯 Apache PHP 配置

Nano 編輯器顯示 Apache php.ini 檔案中 memory_limit 設定為 512M,然後執行 Apache 重新啟動指令。
使用 Apache mod_php,編輯 Apache 特有的 PHP 配置,然後重新啟動 Apache,以便新的工作進程載入新的限制。

如果 Apache 直接將 PHP 作為模組加載,請編輯 Apache 特有的檔案:

sudo nano /etc/php/7.4/apache2/php.ini

放:

memory_limit = 512M

然後重啟 Apache:

sudo systemctl restart apache2

不要機械地複製版本號。請檢查 Apache 實際載入的版本。跨多個 PHP 版本升級的系統通常會在 . 目錄下保留多個目錄/etc/php/。

結果標準很簡單:重新啟動後,面向 Web 的 PHP 執行時必須顯示新值。如果仍然顯示 128M,則表示另一個配置層覆蓋了您的編輯。

6. 當 occ 或 cron 使用的記憶體過少時,更新 CLI 記憶體限制

管理員網頁警告是由 Web 執行時間驅動的,但occcron 作業使用的是 PHP 命令列介面 (CLI)。 ownCloud 的文檔對此有明確的說明。

編輯:

sudo nano /etc/php/7.4/cli/php.ini

放:

memory_limit = 512M

然後進行核實:

php -r 'echo ini_get("memory_limit"), PHP_EOL;'

對於 CLI PHP,您無需重新啟動服務,因為每次 CLI 呼叫都會啟動一個新進程。但是,如果您的 cron 作業明確地呼叫了另一個 PHP 二進位文件,請驗證該二進位檔案的具體名稱,而不是想當然地認為/usr/bin/php它就是正在使用的那個。

ownCloud 建議occ以 HTTP 使用者身分執行,通常www-data在 Debian/Ubuntu 系統上如此。其官方 occ 文件也警告說,occ如果安裝了多個 PHP 版本,則應使用與 Web 伺服器相同的 PHP 版本。

7. Docker:使用 OWNCLOUD_MEMORY_LIMIT 而非編輯容器內的文件

Docker Compose 檔案顯示 OWNCLOUD_MEMORY_LIMIT 設定為 512M,且 ownCloud 容器正在重新建立。
對於官方的 ownCloud 容器,請OWNCLOUD_MEMORY_LIMIT=512M在容器環境中進行設定並重新建立服務,以便更新產生的 PHP 配置。

對於官方的 ownCloud Docker 映像,請使用文件中記錄的環境變數:

environment:
  OWNCLOUD_MEMORY_LIMIT: 512M

然後重新建立該服務:

docker compose up -d

不要php.ini在臨時容器內進行主要修復。容器重建可能會遺失這些變更。官方的 ownCloud Docker 環境文件定義OWNCLOUD_MEMORY_LIMIT=512M並建議保持此預設設定。

如果 Docker 主機本身記憶體限制嚴格,也要檢查容器的限制:

docker stats

PHP 512MB 的記憶體限制並不會神奇地為容器分配 512MB 的可用記憶體;它只是允許單個 PHP 請求最多消耗這麼多記憶體。容器和主機仍然需要足夠的記憶體來支援所有並發的 PHP 工作進程和其他服務。

8. 重新啟動正確的服務,並從相同的執行環境進行驗證。

終端機正在重新啟動 PHP-FPM 和 Nginx,ownCloud 概覽顯示 PHP 記憶體限制為 512 MB,各項檢查都已通過。
只有當 Web 運行時報告記憶體使用量達到 512M 或更多,且 ownCloud 不再顯示記憶體不足警告時,修復才算完成。

重新啟動相關服務後,重新檢查臨時 phpinfo 頁面或 ownCloud 管理概覽。然後刪除 phpinfo 頁面。

如果您更改了 PHP-FPM,請檢查:

sudo systemctl status php7.4-fpm
sudo systemctl status nginx

如果您更改了 Apache:

sudo systemctl status apache2

刷新 ownCloud 管理頁面。如果 ownCloud 現在以至少預期的限制運行,則警告應該會消失。

9. 將 PHP 限制提高到 512MB 以上之前,請檢查主機記憶體。

Ubuntu 終端機顯示可用記憶體、PHP-FPM 工作進程以及最近的 ownCloud 日誌條目
提高單次請求限制後,請檢查系統總記憶體使用量和 PHP 工作進程的運作情況。提高 PHP 上限可能會導致大量工作進程同時運行時,最壞情況下的記憶體消耗增加。

跑步:

free -h
ps aux | grep php-fpm
vmstat 1

PHP 的memory_limit內存上限是針對每個腳本的,它並非預留內存,也與伺服器所需的 RAM 容量不同。如果您有 20 個 PHP 工作進程,並且允許每個請求使用非常大的內存,那麼理論上的最壞情況可能會遠遠超過伺服器的 RAM 容量。

ownCloud 的調優文件對 Web 伺服器進程也提出了同樣的警告:應控制進程數量,使總記憶體使用量低於可用 RAM,否則系統將開始使用交換空間,導致效能下降。請參閱ownCloud Classic 調校指南。

如果 512M 警告消失且正常運作正常,就沒有理由為了增加數值而提高限制。

10. 當 512M 仍然出現「允許的記憶體大小已用完」的錯誤時

清除推薦警告和記憶體耗盡崩潰是不同的問題。如果日誌包含以下訊息:

PHP Fatal error: Allowed memory size of ... bytes exhausted

確定觸發該問題的操作。大型掃描、加密作業、外部儲存操作、影像處理或第三方應用程式的記憶體佔用情況可能大不相同。

檢查 ownCloud 的日誌和 PHP/Web 伺服器的錯誤日誌。標準的 ownCloud 安裝會在配置的資料目錄下寫入自己的日誌,通常位於 `/etc/ownCloud/log/` data/owncloud.log。不要將“增加到 1G”視為下一步的自動操作。首先要確定相同的操作是否重複達到記憶體上限。

如果某個已知的管理任務確實需要更多內存,那麼有針對性的 CLI 覆蓋可能比全局地給每個 Web 請求設置很大的內存限制更安全:

php -d memory_limit=1G occ <command>

僅當了解命令和記憶體行為時才使用此方法。它無法修復透過 PHP-FPM 或 Apache 運行的 Web 請求。

為什麼編輯 php.ini 檔案後警告仍然存在

症狀可能原因下一步檢查
php -r顯示 512M,ownCloud 仍顯示 128M您僅更改了 CLI PHP。檢查瀏覽器phpinfo及其已載入的設定檔。
FPM 檔案顯示大小為 512M,但瀏覽器仍顯示為 128M。Pool.user.ini或其他 INI 檔案會覆蓋它檢查 phpinfo “local” 和 “master” 值以及其他解析的 INI 檔案。
數值僅在重啟後發生變化正確的服務未重啟。編輯完成後,請明確重新啟動 PHP-FPM 或 Apache。
重新建立後,Docker 值將恢復為舊設定。您在容器內進行了編輯。OWNCLOUD_MEMORY_LIMIT在 Compose 或部署環境中設定。
警告消失,但伺服器開始交換資料。PHP 並發超出主機內存減少工作線程數、優化工作負載或增加記憶體。

不要將記憶體限制與上傳限制混淆。

memory_limit,,upload_max_filesize並且post_max_size解決的是不同的問題。增加 PHP 記憶體並不會自動允許使用者上傳更大的檔案。 ownCloud 10.16 的配置說明單獨指出,post_max_size應將記憶體配置為至少 512 MB(文件中規定的最低要求),並解釋上傳限制需要單獨設定。

如果實際症狀是“大檔案上傳失敗”,請檢查upload_max_filesize代理程式post_max_size/網路伺服器的請求體大小限制、逾時時間和臨時磁碟容量。不要用更高的值memory_limit來取代這些控制措施。

最終檢查清單

  • 請在ownCloud中確認警告訊息和目前值。
  • 確定 ownCloud 使用的是 Apache mod_php 還是 PHP-FPM。
  • 找到Web運行時的已載入設定檔。
  • 將 Web PHP 版本memory_limit至少設定為512M.
  • occ如果cron 使用了較低的限制,也請更新 CLI PHP 。
  • 對於 Docker,請OWNCLOUD_MEMORY_LIMIT=512M在部署環境中進行設定。
  • 重新啟動或重新建立實際運行 PHP 的服務。
  • 不僅要從命令列介面驗證值,還要從 Web 執行時間驗證值。
  • 確認 ownCloud 警告已消失。
  • 在將限制提高到 512M 以上之前,請先檢查主機 RAM 和交換空間。

結論

解決 ownCloud 10 中「PHP 記憶體限制低於建議值」問題的根本方法是,將實際執行 ownCloud 的 PHP 運行時的記憶體限制設為 512 MB 或更高,然後從同一執行時間驗證結果。最常見的錯誤是在/etc/php/.../cli/php.iniownCloud 透過 PHP-FPM 或 Apache 運行,並且使用了不同的設定檔時進行編輯。

一旦警告消失、日常操作正常且主機記憶體餘量充足,即可停止操作。如果 PHP 在特定操作期間仍然耗盡 512 MB 內存,則應從「提高內存限制」轉向工作負載診斷:檢查失敗的命令、應用程式、日誌、並發情況和實體記憶體。更大的記憶體限制可能適用,但前提是工作負載需要更高的限制,並且伺服器能夠安全地支援該限制。

留下評論

10 款最佳 Ping 掃描工具,協助您尋找網路上的設備

10 款最佳 Ping 掃描工具,協助您尋找網路上的設備

比較 10 款 ping 掃描工具,它們可用於快速發現區域網路、跨平台掃描和 IP 位址管理。了解掃描可以告訴您什麼,以及不能告訴您什麼。

用於追蹤效能的 6 款最佳網路管理工具

用於追蹤效能的 6 款最佳網路管理工具

比較六款網路管理工具的效能監控功能,包括 SNMP 覆蓋範圍、映射、警報、部署模型和成本權衡。

適用於 Windows、iOS 和 Android 的最佳 Wi-Fi 分析器

適用於 Windows、iOS 和 Android 的最佳 Wi-Fi 分析器

比較適用於 Windows、iPhone 和 Android 的 Wi-Fi 分析器,包括頻道擁塞、訊號覆蓋範圍、熱圖和網路故障排除工具。

Ping 監控:7 款免費開源的網路可用性工具

Ping 監控:7 款免費開源的網路可用性工具

比較七款免費開源的 ping 監視器,從完整的網路套件到專注於延遲探測的工具,選擇最適合可用性、丟包率和歷史記錄的工具。

網路中的服務品質 (QoS):服務品質的角色和工作原理

網路中的服務品質 (QoS):服務品質的角色和工作原理

了解 QoS 在網路中的意義,DSCP 標記和流量佇列如何對語音、視訊和業務應用程式進行優先排序,以及 QoS 無法解決的問題。

最佳SFTP伺服器軟體,實現安全檔案傳輸

最佳SFTP伺服器軟體,實現安全檔案傳輸

比較適用於 Windows 和 Linux 的可靠 SFTP 伺服器軟體,包括 OpenSSH、Bitvise、SolarWinds 和 SFTPGo。尋找最適合您的安全性和文件傳輸需求的軟體。

適用於網路團隊的 7 款最佳 IP 位址管理工具

適用於網路團隊的 7 款最佳 IP 位址管理工具

比較七款 IP 位址管理工具,包括子網路發現、DNS 和 DHCP 協調、網路清單和開源 IPAM。

網路監控最佳實務:監控哪些內容以及使用哪些工具

網路監控最佳實務:監控哪些內容以及使用哪些工具

建置實用的網路監控,提供清晰的設備覆蓋範圍、有用的效能指標、可操作的警報,並對 SolarWinds NPM、PRTG 和 OpManager 進行比較。

十大最佳網路掃描工具,幫助您發現裝置和 IP 位址

十大最佳網路掃描工具,幫助您發現裝置和 IP 位址

比較網路掃描工具,以實現快速設備發現、跨平台 IP 掃描和企業級 IPAM,並指導如何將每個選項與您的網路相符。

如何使用 Nmap 進行路由追蹤並讀取網路路徑

如何使用 Nmap 進行路由追蹤並讀取網路路徑

使用 Nmap 的 --traceroute 選項將躍點對應到授權主機,了解躍點和 RTT 輸出,並在不進行過度掃描的情況下排查缺失的回應。