Jak rozwiązać PHP Błąd krytyczny: Dozwolony rozmiar pamięci wynoszący 8388608 bajtów wyczerpany

Jeden z najczęstszych i najbardziej frustrujących błędów napotkanych przez programistów PHP brzmi: "Błąd krytyczny: Dozwolony rozmiar pamięci wynoszący 8388608 wyczerpanych bajtów ...", a następnie coś w stylu "(próbowano przydzielić XXXX bajtów) w /home/www/file.module on line 12. "Ten fatalny błąd PHP powoduje, że domyślnie PHP ma limit wykorzystania pamięci wynoszący 8 MB dla danego skryptu. Jest to dobre rozwiązanie, ponieważ nie chcesz, aby nieuczciwy skrypt PHP niszczał twój serwer przez wyłapywanie całej pamięci. Czasami jednak masz skrypt PHP, który zwykle przekracza limit 8 MB ( powiedzmy, do importowania lub przesyłania ). Aby obejść błąd "Błąd krytyczny: Dozwolony rozmiar pamięci 8388608 bajtów wyczerpanych ...", po prostu wstaw ten wiersz kodu do skryptu u góry:

ini_set ("memory_limit", " 16M ");

Spowoduje to ustawienie limitu pamięci na 16 MB, zamiast 8 MB. Możesz, i powinieneś, bawić się z tym numerem, tak aby był jak najniższy bez powtarzania tego komunikatu o błędzie. To zmieni jedynie limit pamięci dla tego konkretnego pliku PHP.

Alternatywnie możesz zmienić plik php.ini, aby zwiększyć limit pamięci. Wpłynie to na wszystkie skrypty na twoim serwerze. Po prostu otwórz php.ini i znajdź wiersz z napisem "memory_limit" i zmień go:

memory_limit = 16M

Zauważyłem w moim własnym pliku PHP.ini, że moje domyślne jest znacznie wyższe na 128M. Tak więc, gdybym kiedykolwiek otrzymał ten komunikat o błędzie, przeczytałby: "Błąd krytyczny: Dozwolony rozmiar pamięci 134217728 bajtów wyczerpany ..." i oczywiście jest znacznie większym problemem. Ale ma to samo obejście, co "Błąd krytyczny: Dozwolony rozmiar pamięci wynoszący 8388608 bajtów wyczerpany ..." lub "Błąd krytyczny: Dozwolony rozmiar pamięci 16777216 wyczerpanych bajtów ..." lub cokolwiek innego. Wygląda na to, że domyślny limit pamięci został zwiększony z 8M do 16M w PHP 5.2.0 i obecnie wynosi 128M dla PHP 5.3.0, co wyjaśniałoby, dlaczego ten komunikat o błędzie może w ogóle nie być wyświetlany.

Możesz także wyłączyć limit pamięci przez ustawienie parametru memory_limit na -1 w pliku PHP.ini.

memory_limit = -1

Zazwyczaj nie jest to dobry pomysł z oczywistych powodów.

Uwaga: Możesz także użyć linii memory_limit na stronie .htaccess.

Pamiętajcie, to tylko obejście. Naprawdę, twój skrypt PHP nie powinien przekraczać 8 MB, chyba że przesyłasz pliki lub robisz coś innego, co oczywiście wymaga dużej ilości pamięci. Naprawdę powinieneś się zastanowić, dlaczego twój skrypt używa tak dużo pamięci i spróbować ją naprawić. Jednym ze sposobów sprawdzenia, ile pamięci wykorzystuje skrypt PHP, jest użycie funkcji PHP memory_get_usage (). Po prostu powtórz to w dowolnym momencie skryptu, aby dowiedzieć się, gdzie rośnie wykorzystanie pamięci:

echo memory_get_usage ();

Jeśli otrzymujesz ten komunikat o błędzie w Drupal lub Joomla, prawdopodobnym winowajcą jest nowy moduł lub pakiet. Na przykład w Drupal strona admin / modules ładuje każdy moduł w twojej instalacji Drupala, który może się włochaty, jeśli moduł niestandardowy jest błędny, uszkodzony lub zhackowany. Spróbuj wyłączać moduły jeden po drugim, aby zidentyfikować, które powoduje opuszczenie partii. Ponadto niektórzy dostawcy usług hostingowych zignorują twoje próby modyfikacji limitów pamięci dla twojego kodu PHP, więc możesz potrzebować skontaktować się ze wsparciem hostingu, aby ci pomóc. Czasami potrzebuję edytować plik php.ini i czasami umieszczam go w pliku .htaccess. Tak czy siak, miejmy nadzieję, że ta informacja wystarczy, abyś był na najlepszej drodze!