Limit pamięci PHP w WordPress, czyli Fatal error: Out of memory

WordPress Błąd Fatal Error
Naprawa Błędów na stronach internetowych WordPress

Jednym z najczęstszych błędów, które naprawiam w ramach usługi awaryjnego rozwiązywania problemów WordPress, jest Fatal error: Out of memory tried to allocate. Jest to dość powszechny błąd, który może się przydarzyć nawet najbardziej zadbanej stronie i w absolutnie losowym momencie.

Rozwiązanie tego problemu w 9/10 przypadkach jest dość proste i polega na zwiększeniu limitu pamięci, ponieważ błąd jest spowodowany próbą zużycia pamięci RAM (serwera lub konta hostingowego) przekraczającej ustalony limit lub ogólną dostępną ilość. Zobacz, dlaczego tak się dzieje i jak naprawić ten błąd.

Przyczyna błędu Fatal error: Out of memory

Skoro tutaj jesteś to podejrzewam, że spotkałeś/aś się z tym błędem, ale nie tylko Ty o nim wiesz. Mogą też wiedzieć  postronne osoby widząc taki oto obrazek:

Fatal Error WordPress Out Of Memory
Fatal Error — brak pamięci. W witrynie wystąpił błąd krytyczny.

Czasem ten błąd spowodowany jest jakąś większą operacją podczas prac nad stroną, a czasem całkowicie przypadkowo, choć nie bez powodu.

Być może wiesz, że WordPress jest tworzony w PHP, języku programowania, który nie jest kompilowany (nie tworzy pliku wykonywalnego takiego jak np. exe w Windows), ale jest interpretowany: pliki z rozszerzeniem .php znajdują się na serwerze i za każdym razem, gdy ktoś wysyła żądanie, serwer je odczytuje i wykonuje polecenia zapisane w tych plikach.

Choć brzmi to technicznie w rzeczywistości jest całkiem proste — za każdym razem jak klient wykonuje jakąś akcje na stronie np. odwiedza ją, wysyła formularz, dokonuje zakupu serwer wykonuje polecenia zapisane w konkretnych plikach PHP WordPressa, motywu lub wtyczki lub z wszystkiego po trochu :)

Podobnie jak na komputerze do wykonania każdej takiej operacji potrzebujesz pamięci operacyjnej, aby zadania wykonać szybko, sprawnie i poprawnie. W przypadku, gdy do wykonania danej operacji nie ma wystarczająco dużo pamięci zobaczysz taki właśnie błąd:

Fatal error: Allowed memory size of 1043576 bytes exhausted (tried to allocate 122688 bytes) in /wp-includes/functions.php on line 188

Co po naszemu oznacza – chciałem wykonać jakąś operację z plikiem tym i tym, ale brakuje mi miejsca w pamięci, a więc zostanę sobie tutaj i przestanę robić cokolwiek.

Powody wystąpienia błędu

Ten błąd wydaje się być przypadkowy, ale to czy wystąpi zależy od wielu rzeczy. Ich kombinacja może spowodować, że pojawia się na stronie internetowej, a nie na innej o tej samej konfiguracji i tej samej treści, która znajduje się na innym serwerze. Do czynników wpływających zaliczają się:

  • ustawienia i limity hostingu,
  • Ogólne obciążenie konta lub serwera dostawcy hostingu,
  • (Nie)korzystanie z pamięci podręcznej

Ustawienia i limity hostingu

W przypadku, gdy posiadasz hosting współdzielony musisz mieć na uwadze, że każde Twoje konto ma swoje ograniczenia lub tzw. limity bezpieczeństwa. Idealnie to widać np. na stronie hostingu Home.pl:

Parametry Bezpieczenstwa Serwerow Home
Parametry bezpieczeństwa serwerów home.pl (https://pomoc.home.pl/baza-wiedzy/parametry-bezpieczenstwa-serwerow-home-pl)

Jak widzisz im tańszy hosting, tym mniej masz dostępnej maksymalnej pamięci operacyjnej. I możesz wykonywać wszystkie opisane poniżej metody na naprawienie błędu, poprzez ustawienie większej ilości pamięci, ale i tak nie możesz przekroczyć tych wskazanych w umowie/regulaminie hostingu. To zwyczajnie nie zadziała.

W takim przypadku masz dwa wyjścia:

  • Zmienić plan hostingu na droższy
  • Przenieść stronę na rekomendowany hosting
Specjalna oferta dla czytelników:
Osobiście polecam dHosting, gdzie masz gwarantowane 2GB pamięci RAM w ramach konta, a gdy potrzebujesz więcej płacisz tylko za to czego potrzebujesz w stawce za minutę. Dzięki temu strona działa niezależnie od obciążenia. Tutaj sprawdzisz ofertę z rabatem, a tutaj moją recenzję dHosting’u.

Co innego, gdy masz serwer VPS lub dedykowany, gdzie nie musisz dzielić zasobów na jednej maszynie z dziesiątkami innych klientów i to od zasobności Twojego portfela zależy jakie są ogólne limity maszyny, czy to dedykowanej, czy wirtualnej.

Ogólne obciążenie konta lub serwera dostawcy hostingu

I to prowadzi nas do następnego powodu tego błędu. Bo oczywiście strona z kilkoma równoczesnymi odwiedzinami to nie to samo, co inna, na której w danym momencie znajduje się dziesiąt tysięcy. Oczywiście serwer potrzebuje znacznie więcej pamięci w tym drugim przypadku.

Strona internetowa z setką aktywnych wtyczek i motywem zakupionym na ThemeForest, a który nie został odpowiednio zoptymalizowany sprawi, że serwer będzie się strasznie męczył, nie jest tym samym, co ta z kilkoma wtyczkami, dobrze zoptymalizowana i zaprogramowana na wydajnym motywie pisanym na miarę potrzeb i wymagań.

Zmierzam to tego, że każda strona ma inną budowę, ruch oraz specyfikę i należy to przy projektowaniu lub chociaż optymalizowaniu jej uwzględnić.

Dużo rzadszym błędem jest ten spowodowany obciążeniem głównego serwera, na którym masz swoje konto hostingowe. to problemy zwykle krótkotrwałe, często poprzedzone mailem od usługodawcy o np. przerwie lub pracach konserwacyjnych. A nawet jeżeli nie to są krótkotrwałe.

(Nie)korzystanie z pamięci podręcznej

System pamięci podręcznej pozwala uniknąć powtarzających się żądań kierowanych do serwera. Jego działanie polega na tym, że jeśli witryna zostanie odwiedzona sto razy w celu wyświetlenia tej samej podstrony, serwer wygeneruje tę stronę tylko raz, postępując zgodnie z instrukcjami odpowiednich plików PHP, i zapisze ją w formacie HTML jako statyczny plik. Pozostałe 99 osób zobaczy ten plik HTML, dzięki czemu serwer nie musi za każdym razem wykonywać tych samych operacji i obciążać serwer.

Czasem wtyczka jaką stosujesz do zarządzania pamięcią podręczną jest nieodpowiednio dobrana lub zwyczajnie źle skonfigurowana. To drugie może być zwykle powodem na stronach z dużą ilością dynamicznej treści oraz na sklepach internetowych opartych o WordPress z wtyczką WooCommerce lub inną.

Diagnozujemy problem i jego przyczynę

A teraz, gdy jesteś małym ekspertem w dziedzinie tego błędu, jego przyczyn i czynników wpływających na jego wystąpienie, będziesz już w stanie sam wywnioskować, jakie jest rozwiązanie, aby tak się nie stało. Jako, że najprostsze rozwiązania są zwykle najlepsze — Zwiększ pamięć dostępną do wykonania kodu PHP. A może nie?

To może tymczasowo pomóc, ale podobnie jak z wirusami na stronie i leczeniem na NFZ — leczenie objawów niekoniecznie rozwiązuje problem. Mimo wszystko musisz poznać przyczynę i zmniejszyć prawdopodobieństwo, że problem wystąpi. Często okazuje się, że to źle napisana wtyczka lub jakaś jej funkcja, która wpada w pętle i wykonuje się niepotrzebnie w nieskończoność lub jakiś skrypt działa w tle, choć w danej chwili nie jest wcale potrzebny.

Ok, to skrajny przypadek, ale co jeśli mamy wiele wtyczek i niewydajny motyw, który oczekuje nieskończenie wiele zasobów od serwera? Zwiększenie dostępnej pamięci rozwiąże błąd (przynajmniej na razie), ale nie zapobiegnie temu, że nasza witryna będzie ciężka, nieefektywna i ogólnie powolna. Konieczna będzie, analiza, wyciągnięcie wniosków, wdrożenie poprawek i obserwacja.

Jeżeli nie chcesz tego robić samodzielnie lub nie masz na to czasu → użyj formularza kontaktowego.

Ile masz dostępnej pamięci?

O ile masz szczęście to działa tobie kokpit WordPress, a strona logowania działa i możesz sprawdzić w „Stanie witryny” ile aktualnie masz dostępnej pamięci oraz ile wg. WordPressa możesz z niej użyć. Ten drugi parametr całe szczęście można samodzielnie ustawić.

Aby to zrobić przejdź kolejno do zakładek — Narzędzia > Stan Witryny > Informacje > Rozwiń sekcję „Serwer” i tam znajdziesz opcję „Limit pamięci PHP„.

Drugim sposobem jest skorzystanie z funkcji w PHP wyświetlające to informacje. Stwórz plik info.php i wklej do niego poniższy kod:

<?php
phpinfo();
?>

Plik wgraj na serwer do głównego katalogu i wejdź na stronę TwojaStrona.pl/info.php, a zobaczysz coś takiego:

Plik Funkcja Phpinfo
Wynik wykonania funkcji phpInfo

Skorzystaj z opcji wyszukiwania na stronie (CTRL+F/CMD+F) i odnajdź „memory_limit”:

Phpinfo Memory Limit
Zmienna memory_limit w phpInfo

Proszę bardzo: 128 MB w tym przypadku. Przy okazji na obrazku widać, że możesz znaleźć inne interesujące wartości, takie jak maksymalny dozwolony rozmiar pliku, maksymalny czas wykonania itp., a następnie usuń plik info.php lub jakkolwiek go nazwałeś. Gdyby ktoś znalazł ten plik to pomógłbyś mu np. we włamaniu się na stronę.

Rozwiązanie problemu Fatal error Allowed memory size

Wiesz już, na czym polega problem i upewniliśmy się, że nie jest on związany z naszą instalacją WordPressa (nadmiar wtyczek lub złe zaprogramowanie motywu lub wtyczek, albo brak optymalizacji). Teraz pojawia się pytanie za milion punktów: jak to naprawić?

Są na to zwykle dwa sposoby, ale w razie wątpliwości możesz zapytać swojego dostawcę usług o zmianę limitu pamięci lub sprawdzić to na jego stronach pomocy.

WP_MEMORY_LIMIT i WP_MAX_MEMORY_LIMIT w WordPress

W pliku wp-config.php na serwerze tuż nad linią z komentarzem „To wszystko…” umieść te dwie zmienne:

define( 'WP_MEMORY_LIMIT', '500M' );
define( 'WP_MAX_MEMORY_LIMIT', '500M' );

Pierwsza zmienna WP_MEMORY_LIMIT określa dozwoloną, maksymalną ilość pamięci jaką WordPress może wykorzystać do wyświetlania Front-endu serwisu, czyli tego co widzi użytkownik.

Druga WP_MAX_MEMORY_LIMIT określa dozwoloną, maksymalną ilość pamięci operacyjnej dla Back-endu, czyli kokpitu Twojej strony internetowej.

Pamiętaj, że wartości te nie mogą być wyższe, niż te ustawione na poziomie samego PHP, a więc…

Zmiana zmiennych php.ini na serwerze

W przypadku serwerów VPS i dedykowanych należy zmienić ten plik często bezpośrednio, ale w przypadku serwerów współdzielonych jest to zróżnicowane i może się odbyć na dwa sposoby:

1) Dodanie pliku php.ini do głównego katalogu domeny z wprowadzonymi zmiennymi jak to jest np. w ramach serwerów OVH, czy wspomnianego Home.pl. Taki przykładowy plik może wyglądać tak:

memory_limit = 500M
error_log = /bledy.log
error_reporting =  E_ALL & ~E_NOTICE
log_errors = 1
display_errors = off

2) Zmiana zmiennych w ramach pliku .HTACCESS znajdującego się w głównym katalogu domeny. Na końcu tego pliku należy dopisać następujący kod (UWAGA! Dozwolone flagi i ich format zależny jest od Twojego usługodawcy). Tutaj przykład dla dHosting.

php_value memory_limit 500M
php_value post_max_size 500M
php_value upload_max_filesize 500M
php_value max_execution_time 3000

Podsumowanie

Teraz już chyba rozwiązałeś swój problem ze zbyt małym limitem pamięci. Jeżeli jednak problem dalej u Ciebie występuje wypełnij formularz kontaktowy i zobaczę jak mogę Ci pomóc.

4/5 - (1 vote)
dHosting najlepszy serwer dla wordpress i nie tylko

Na stronie mogą znajdować się linki polecające (affiliacyjne), które pozwalają utrzymać bloga. Zakup z mojego polecenia nie generuje dla Ciebie dodatkowych kosztów, a ja otrzymam prowizje od kwoty zapłaconej.

Przyłącz się do dyskusji