Napraw „Limit pamięci PHP poniżej zalecanej wartości” w ownCloud 10
Oczekiwany rezultat to nie tylko „zniknięcie ostrzeżenia”. Prawidłowe rozwiązanie oznacza, że proces PHP obsługujący ownCloud 10 zgłasza limit pamięci wynoszący co najmniej 512 MB, ostrzeżenie administratora ownCloud znika, zadania zaplanowane lub CLI również używają odpowiedniego limitu, a host nadal ma wystarczająco dużo pamięci fizycznej do uruchamiania PHP, serwera WWW, bazy danych i zadań w tle bez konieczności intensywnego przełączania.
W przypadku ownCloud Classic 10.16 oficjalne środowisko Dockera OWNCLOUD_MEMORY_LIMIT=512Mjest zalecane domyślnie. Dokumentacja ownCloud rozróżnia również konfigurację PHP używaną przez serwer WWW od tej używanej przez php-cli. To rozróżnienie jest głównym powodem, dla którego administratorzy czasami zmieniają memory_limit, restartują usługę i nadal widzą to samo ostrzeżenie.
Ten przewodnik rozpoczyna się od najmniej uciążliwych kontroli, a następnie przedstawia ścieżki Apache, PHP-FPM, CLI i Dockera. Wyjaśnia również, kiedy dalsze zwiększanie limitu jest uzasadnione, a kiedy prawdziwym problemem jest niewystarczająca ilość pamięci RAM hosta, a nie samo ustawienie PHP.
Jak wygląda sukces
Sprawdzać
Dobry wynik
Jeśli się nie uda
przegląd administratora ownCloud
Brak ostrzeżenia „Limit pamięci PHP poniżej zalecanej wartości”
Prawdopodobnie zmieniłeś konfigurację PHP lub nie uruchomiłeś ponownie właściwej usługi.
Środowisko wykonawcze PHP w sieci Web
memory_limitpokazuje 512M lub więcej
Znajdź załadowany plik konfiguracyjny używany przez żądanie sieciowe.
CLI / środowisko wykonawcze cron
php -r 'echo ini_get("memory_limit");'pokazuje zamierzoną wartość
php.iniEdytuj również elementy specyficzne dla CLI .
Pamięć hosta
Wystarczająca ilość dostępnej pamięci RAM; niewielkie lub żadne stałe obciążenie pamięcią wymiany
Nie zwiększaj limitów PHP bezmyślnie. Sprawdź ponownie liczbę pracowników PHP lub rozmiar hosta.
Dzienniki
Brak powtarzających się błędów „Wyczerpany dozwolony rozmiar pamięci”
Przed ponownym zwiększeniem limitu znajdź obciążenie zużywające pamięć.
1. Potwierdź ostrzeżenie i wartość, którą widzi ownCloud
Zacznij od wartości widocznej dla samego ownCloud. Limit 128 MB lub 256 MB dla środowiska uruchomieniowego jest niższy niż wartość 512 MB używana w zalecanej przez ownCloud konfiguracji Dockera.
Otwórz ustawienia administracyjne ownCloud i zanotuj ostrzeżenie o limicie pamięci. Przed wprowadzeniem jakichkolwiek zmian zanotuj wersję ownCloud, wersję PHP, typ serwera WWW i aktualny limit pamięci. To da Ci punkt odniesienia i pomoże uniknąć zmiany niewłaściwej instalacji PHP w systemach z wieloma wersjami PHP.
W aktualnej dokumentacji ownCloud 10.16 podano, że wymagania serwera w dużym stopniu zależą od liczby użytkowników, plików i aktywności. Konfiguracja Dockera OWNCLOUD_MEMORY_LIMIT=512Mzaleca zachowanie tej wartości domyślnej. To sprawia, że 512 MB to rozsądna wartość bazowa dla rozwiązania problemu, ale nie gwarantuje, że każde obciążenie zmieści się w 512 MB.
Jest to przydatne w przypadku occzadań cron, ale nie stanowi dowodu na to, do czego służy żądanie sieciowe. ownCloud wyraźnie dokumentuje oddzielne ścieżki konfiguracji, takie jak:
Jeżeli interfejs CLI wyświetla komunikat 512M, a strona administratora nadal wyświetla komunikat o błędzie, ta niezgodność jest wyraźnym sygnałem, że serwer WWW ładuje inny plik php.ini.
3. Znajdź konfigurację PHP używaną przez żądanie sieciowe
Porównaj środowisko wykonawcze PHP przeglądarki z środowiskiem wykonawczym CLI. Plik konfiguracyjny załadowany w przeglądarce to plik, który ma znaczenie dla ostrzeżenia internetowego ownCloud.
Najbardziej wiarygodnym testem jest sprawdzenie kodu PHP z tego samego stosu internetowego, który obsługuje ownCloud. Dokumentacja ownCloud opisuje użycie phpinfo.phpstrony tymczasowej:
<?php phpinfo(); ?>
Umieść go tymczasowo w katalogu głównym witryny, otwórz w przeglądarce i znajdź:
Załadowany plik konfiguracyjny
limit_pamięci
API serwera
Następnie natychmiast usuń plik phpinfo . ownCloud ostrzega, że pozostawienie publicznej strony phpinfo ujawnia poufne informacje serwera.
Jeżeli przeglądarka wyświetla komunikat , /etc/php/7.4/fpm/php.inigdy php --iniwyświetla komunikat /etc/php/7.4/cli/php.ini, teraz już wiesz dokładnie, dlaczego edycja pliku CLI nie spowodowała usunięcia ostrzeżenia.
4. PHP-FPM: podnieś limit czasu wykonania w sieci do 512 MB
W przypadku konfiguracji Nginx lub Apache przy użyciu PHP-FPM należy zmienić FPM php.inilub odpowiednie zastąpienie puli/strony, a nie tylko plik CLI.
W przypadku typowej instalacji Debiana lub Ubuntu:
sudo nano /etc/php/7.4/fpm/php.ini
Znajdować:
memory_limit = 128M
i zmień na:
memory_limit = 512M
Użyj zainstalowanej wersji PHP w ścieżce. Następnie uruchom ponownie odpowiednią usługę FPM i serwer WWW, jeśli to konieczne:
W przypadku Apache'a z proxy_fcgiinną konfiguracją FPM należy zrestartować PHP-FPM i ponownie załadować Apache'a.
ownCloud zauważa również, że PHP-FPM nie pobiera ustawień PHP z .htaccess. Jeśli korzystasz z nadpisywania dla poszczególnych katalogów w FPM, użyj obsługiwanego mechanizmu konfiguracji PHP/FPM dla swojego środowiska, takiego jak odpowiednia php.inikonfiguracja puli lub .user.ini.
5. Apache z mod_php: edytuj konfigurację Apache PHP
Używając modułu Apache mod_php, edytuj konfigurację PHP specyficzną dla Apache i ponownie uruchom Apache, aby nowe procesy robocze załadowały nowy limit.
Jeśli Apache ładuje PHP bezpośrednio jako moduł, edytuj plik specyficzny dla Apache:
sudo nano /etc/php/7.4/apache2/php.ini
Ustawić:
memory_limit = 512M
Następnie uruchom ponownie Apache'a:
sudo systemctl restart apache2
Nie kopiuj numeru wersji mechanicznie. Sprawdź wersję faktycznie załadowaną przez Apache. Systemy aktualizowane w ramach kilku wydań PHP często zachowują wiele katalogów w /etc/php/.
Kryterium wyniku jest proste: po restarcie środowisko uruchomieniowe PHP w przeglądarce musi wyświetlić nową wartość. Jeśli nadal wyświetla 128 MB, inna warstwa konfiguracji nadpisuje edycję.
6. Zaktualizuj limit CLI, gdy occ lub cron używa zbyt mało pamięci
Ostrzeżenie administratora jest generowane przez środowisko uruchomieniowe witryny internetowej, ale occzadania cron korzystają z interfejsu wiersza poleceń PHP. Dokumentacja ownCloud wyraźnie o tym wspomina.
Redagować:
sudo nano /etc/php/7.4/cli/php.ini
Ustawić:
memory_limit = 512M
Następnie sprawdź:
php -r 'echo ini_get("memory_limit"), PHP_EOL;'
Nie musisz restartować usługi dla PHP w interfejsie CLI, ponieważ każde wywołanie CLI uruchamia nowy proces. Jeśli jednak zadanie cron jawnie wywołuje inny plik binarny PHP, zweryfikuj ten konkretny plik, zamiast zakładać, że /usr/bin/phpjest to ten używany.
Firma ownCloud zaleca korzystanie occz konta HTTP, zazwyczaj www-dataw systemach Debian/Ubuntu. Oficjalna dokumentacja OCC ostrzega również, że occw przypadku instalacji wielu wersji PHP należy używać tej samej wersji PHP, co serwer WWW.
7. Docker: użyj OWNCLOUD_MEMORY_LIMIT zamiast edytować pliki w kontenerze
W przypadku oficjalnego kontenera ownCloud należy skonfigurować OWNCLOUD_MEMORY_LIMIT=512Mśrodowisko kontenera i ponownie utworzyć usługę, aby zaktualizować wygenerowaną konfigurację PHP.
W przypadku oficjalnego obrazu ownCloud Docker należy użyć udokumentowanej zmiennej środowiskowej:
environment:
OWNCLOUD_MEMORY_LIMIT: 512M
Następnie utwórz usługę ponownie:
docker compose up -d
Nie wprowadzaj pierwotnej poprawki, edytując php.iniwewnątrz tymczasowego kontenera. Odtworzenie kontenera może spowodować utratę tych zmian. Oficjalna dokumentacja środowiska ownCloud Docker definiuje OWNCLOUD_MEMORY_LIMIT=512Mtę domyślną opcję i zaleca jej zachowanie.
Jeśli host Docker ma ściśle określony limit pamięci, sprawdź także ograniczenia kontenera:
docker stats
Limit PHP wynoszący 512 MB nie daje magicznie kontenerowi 512 MB wolnej pamięci; pozwala on na wykorzystanie tylko tej ilości przez pojedyncze żądanie PHP. Kontener i host nadal potrzebują wystarczającej ilości pamięci dla wszystkich równoczesnych procesów PHP i innych usług.
8. Uruchom ponownie odpowiednią usługę i zweryfikuj ją w tym samym środowisku wykonawczym
Naprawa zostanie wykonana dopiero wtedy, gdy środowisko uruchomieniowe sieci Web zgłosi 512 MB lub więcej, a ownCloud nie będzie już wyświetlał ostrzeżenia o małej ilości pamięci.
Po ponownym uruchomieniu odpowiedniej usługi sprawdź ponownie tymczasową stronę phpinfo lub podgląd administratora ownCloud. Następnie usuń stronę phpinfo.
Jeżeli zmieniłeś PHP-FPM, sprawdź:
sudo systemctl status php7.4-fpm
sudo systemctl status nginx
Jeśli zmieniłeś Apache:
sudo systemctl status apache2
Odśwież stronę administratora ownCloud. Ostrzeżenie powinno zniknąć, jeśli ownCloud działa teraz z co najmniej oczekiwanym limitem.
9. Sprawdź pamięć RAM hosta przed zwiększeniem limitu PHP powyżej 512 MB
Po podniesieniu limitu na żądanie sprawdź całkowitą pamięć systemową i zachowanie procesu roboczego PHP. Wyższy limit PHP może w najgorszym przypadku zwiększyć zużycie pamięci RAM, gdy aktywnych jest wielu pracowników.
Uruchomić:
free -h
ps aux | grep php-fpm
vmstat 1
PHP memory_limitto limit narzucony na skrypt. Nie jest to rezerwacja i nie jest tożsama z ilością pamięci RAM potrzebną serwerowi. Jeśli masz 20 pracowników PHP i każdemu żądaniu dajesz uprawnienia do użycia bardzo dużej ilości pamięci, teoretycznie najgorszy scenariusz może znacznie przekroczyć dostępną pamięć RAM maszyny.
Dokumentacja dotycząca dostrajania ownCloud zawiera to samo ogólne ostrzeżenie dla procesów serwera WWW: należy dostosować liczbę procesów tak, aby łączne wykorzystanie pamięci RAM pozostawało poniżej dostępnej pamięci RAM, w przeciwnym razie system zacznie korzystać z funkcji wymiany i spadnie wydajność. Zobacz wskazówki dotyczące dostrajania ownCloud Classic .
Jeśli ostrzeżenie 512M zniknęło, a normalne operacje przebiegają prawidłowo, nie ma powodu, aby zwiększać limit tylko po to, by liczba była większa.
10. Gdy 512M nadal wyświetla komunikat „Dozwolony rozmiar pamięci został wyczerpany”
Ostrzeżenie o wyczyszczonych zaleceniach i awaria z powodu wyczerpania pamięci to różne problemy. Jeśli logi zawierają komunikaty takie jak:
PHP Fatal error: Allowed memory size of ... bytes exhausted
Zidentyfikuj operację, która ją uruchamia. Duże skanowanie, zadania szyfrowania, operacje na pamięci zewnętrznej, przetwarzanie obrazu czy aplikacja innej firmy mogą mieć bardzo różne profile pamięci.
Sprawdź logi ownCloud i logi błędów PHP/serwera WWW. Standardowa instalacja ownCloud zapisuje własne logi w skonfigurowanym katalogu danych, zazwyczaj data/owncloud.log. Unikaj traktowania „zwiększ do 1 GB” jako automatycznego kolejnego kroku. Najpierw sprawdź, czy ta sama operacja wielokrotnie osiąga limit.
Jeśli jedno znane zadanie administracyjne faktycznie wymaga więcej pamięci, ukierunkowane obejście CLI może być bezpieczniejsze niż globalne nadawanie każdemu żądaniu internetowemu ogromnego limitu:
php -d memory_limit=1G occ <command>
Używaj tego tylko wtedy, gdy rozumiesz działanie polecenia i pamięci. Nie naprawia to żądania internetowego realizowanego przez PHP-FPM lub Apache.
Dlaczego ostrzeżenie może pozostać po edycji pliku php.ini
Objaw
Prawdopodobna przyczyna
Następne sprawdzenie
php -rpokazuje 512M, ownCloud nadal pokazuje 128M
Zmieniłeś tylko CLI PHP
Sprawdź phpinfo przeglądarki i jej załadowany plik konfiguracyjny.
Plik FPM wskazuje 512M, przeglądarka nadal pokazuje 128M
Plik Pool, .user.ini, lub inny plik INI go zastępuje
Sprawdź wartości „local” i „master” phpinfo oraz dodatkowe przeanalizowane pliki INI.
Wartość zmienia się dopiero po ponownym uruchomieniu
Nie uruchomiono ponownie poprawnej usługi
Po edycji należy jawnie zrestartować PHP-FPM lub Apache.
Wartość Dockera powraca do starego ustawienia po ponownym utworzeniu
Edytowałeś wewnątrz kontenera
Ustaw OWNCLOUD_MEMORY_LIMITw Compose lub środowisku wdrożeniowym.
Ostrzeżenie znika, ale serwer rozpoczyna zamianę
Współbieżność PHP przekracza pamięć hosta
Zmniejsz liczbę pracowników, zoptymalizuj obciążenie pracą lub dodaj pamięć RAM.
Nie należy mylić limitu pamięci z limitami przesyłania
memory_limit, upload_max_filesizei post_max_sizerozwiązywać różne problemy. Zwiększenie pamięci PHP nie pozwala automatycznie użytkownikom na przesyłanie większych plików. W oddzielnych notatkach konfiguracyjnych ownCloud 10.16 podano, że post_max_sizenależy skonfigurować co najmniej 512 MB, aby spełnić udokumentowane minimum, i wyjaśniono, że limity przesyłania wymagają osobnych ustawień.
Jeśli rzeczywistym objawem jest „niepowodzenie przesyłania dużych plików”, sprawdź upload_max_filesizelimity post_max_sizerozmiaru ciała serwera proxy/serwera WWW, limity czasu i pojemność dysków tymczasowych. Nie używaj wyższych wartości memory_limitjako zamiennika tych ustawień.
Ostateczna lista kontrolna
Potwierdź ostrzeżenie i bieżącą wartość w ownCloud.
Określ, czy ownCloud używa Apache mod_php czy PHP-FPM.
Znajdź załadowany plik konfiguracyjny środowiska uruchomieniowego sieci Web .
Ustaw web PHP memory_limitna co najmniej 512M.
Zaktualizuj również CLI PHP, jeżeli occcron używa dolnego limitu.
W przypadku platformy Docker należy ustawić ją OWNCLOUD_MEMORY_LIMIT=512Mw środowisku wdrożeniowym.
Uruchom ponownie lub utwórz ponownie usługę, która faktycznie obsługuje PHP.
Sprawdź wartość z poziomu środowiska uruchomieniowego sieci Web, a nie tylko CLI.
Sprawdź, czy ostrzeżenie ownCloud zniknęło.
Przed zwiększeniem limitu powyżej 512 MB należy monitorować pamięć RAM i wymianę hosta.
Podsumowanie
Rozwiązaniem problemu „Limit pamięci PHP poniżej zalecanej wartości” w ownCloud 10 jest ustawienie w środowisku wykonawczym PHP, które faktycznie obsługuje ownCloud, limitu 512 MB lub wyższego, a następnie zweryfikowanie wyniku w tym samym środowisku wykonawczym. Najczęstszym błędem jest edycja, /etc/php/.../cli/php.inigdy ownCloud działa przez PHP-FPM lub Apache z innym plikiem konfiguracyjnym.
Zatrzymaj się, gdy ostrzeżenie zniknie, rutynowe operacje będą działać prawidłowo, a host będzie miał odpowiedni zapas pamięci. Jeśli PHP nadal wyczerpuje 512 MB podczas określonej operacji, przejdź od „zwiększania limitu” do diagnostyki obciążenia: sprawdź niedziałające polecenie, aplikacje, logi, współbieżność i fizyczną pamięć RAM. Wyższy limit może być odpowiedni, ale tylko wtedy, gdy obciążenie to uzasadnia, a serwer może go bezpiecznie obsłużyć.