Ten komunikat o błędzie jest wyświetlany, jakieś sugestie?
Dozwolony rozmiar pamięci 33554432 bajtów wyczerpany (próbował przydzielić 43148176 bajtów) w php
php
memory-management
memory-limit
panidarapu
źródło
źródło
Odpowiedzi:
W końcu znalazłem odpowiedź:
Po prostu dodaj ten wiersz poniżej, zanim pojawi się błąd w pliku
ini_set('memory_limit', '-1');
Zajmie to nieograniczone wykorzystanie pamięci przez serwer, działa dobrze.
Dzięki za sugestie przyjaciół.
źródło
UNLIMITED
.Oto dwie proste metody zwiększenia limitu hostingu współdzielonego:
Jeśli masz dostęp do pliku PHP.ini, zmień wiersz w PHP.ini Jeśli Twój wiersz pokazuje 32M, wypróbuj 64M:
memory_limit = 64M ; Maximum amount of memory a script may consume (64MB)
Jeśli nie masz dostępu do PHP.ini, spróbuj dodać to do pliku .htaccess:
php_value memory_limit 64M
źródło
Twój skrypt zużywa zbyt dużo pamięci. Może się to często zdarzyć w PHP, jeśli masz pętlę, która wymknęła się spod kontroli i tworzysz obiekty lub dodajesz tablice przy każdym przejściu pętli.
Sprawdź nieskończone pętle.
Jeśli to nie jest problem, spróbuj pomóc PHP, niszcząc obiekty, na których skończyłeś, ustawiając je na zero. na przykład.
$OldVar = null;
Sprawdź kod, w którym rzeczywiście występuje błąd. Czy spodziewałbyś się, że linia ta alokuje ogromną ilość pamięci? Jeśli nie, spróbuj dowiedzieć się, co poszło nie tak ...
źródło
Robić :
nigdy nie jest dobre. Jeśli chcesz przeczytać bardzo duży plik, najlepszym rozwiązaniem jest kopiowanie go krok po kroku. Wypróbuj poniższy kod dla najlepszych praktyk.
źródło
while
pętli:fclose($file)
Niestety programowanie w PHP jest łatwe w sposób, który zużywa pamięć szybciej, niż się wydaje. Zrobią to kopiowanie ciągów, tablic i obiektów zamiast korzystania z referencji, chociaż PHP 5 powinno to robić bardziej automatycznie niż w PHP 4. Jednak radzenie sobie z zestawem danych w kilku krokach jest również marnotrawstwem w porównaniu do przetwarzania najmniejszej jednostki logicznej na czas. Klasycznym przykładem jest praca z dużymi zestawami wyników z bazy danych: większość programistów pobiera cały zestaw wyników do tablicy, a następnie zapętla ją raz lub więcej razy
foreach()
. O wiele bardziej wydajna pamięć jest użyciewhile()
pętli do pobierania i przetwarzania jednego wiersza na raz. To samo dotyczy przetwarzania pliku.źródło
Jeśli chcesz czytać duże pliki, powinieneś czytać je krok po kroku zamiast od razu.
To prosta matematyka: jeśli odczytujesz 1 MB dużego pliku naraz, potrzeba co najmniej 1 MB pamięci w tym samym czasie do przechowywania danych.
Więc powinieneś czytać je krok po kroku za pomocą
fopen
&fread
.źródło
$fh = fopen($folder.'/'.$filename, "rb") or die(); $buffer = 1024*1024; while (!feof($fh)) { print(fread($fh, $buffer)); flush(); } fclose($fh);
Ten sam problem napotkałem w php7.2 z laravel 5.6. Po prostu zwiększam ilość zmiennych
memory_limit = 128M
w php.ini zgodnie z wymaganiami moich aplikacji. Może to być 256M / 512M / 1048M ..... Teraz działa dobrze.źródło
Miałem również ten sam problem, szukałem plików phpinfo.ini, php.ini lub .htaccess bezskutecznie. W końcu przejrzałem niektóre pliki php, otworzyłem je i sprawdziłem, czy w kodzie nie ma pamięci. Wreszcie znalazłem to rozwiązanie i zadziałało dla mnie. Korzystałem z wordpress, więc to rozwiązanie może działać tylko w przypadku problemu z limitem wielkości pamięci wordpress. Moje rozwiązanie, otwórz plik default-constants.php w folderze / public_html / wp-zawiera . Otwórz ten plik za pomocą edytora kodu i znajdź ustawienia pamięci w
wp_initial_constants
zakresie lub po prostu Ctrl + F, aby znaleźć słowo „pamięć”. Tam przyjdzieszWP_MEMORY_LIMIT
iWP_MAX_MEMORY_LIMIT
. Po prostu go zwiększ, w moim przypadku było to 64 MB, zwiększyłem go do 128 MB, a następnie do 200 MB.Przy okazji, nie rób następującego kodu, ponieważ to zła praktyka:
źródło
wp-config.php
zamiast których zostaną one zastąpione przez przyszłe aktualizacje WordPress. Ponadto kilka wtyczek bezpieczeństwa (na przykład WordFence) będzie narzekać, jeśli zostaną zmienione „podstawowe” pliki WordPress ...wp-config.php
. I dodać dwie linie tam (i .edefine( 'WP_MEMORY_LIMIT', '200M' );
idefine( 'WP_MAX_MEMORY_LIMIT', '256M' );
. W przeciwieństwie do plików na „core” WP (mianowicie, wszystko podwp-includes
), które zostaną zastąpione przez rozbudowę WP,wp-config.php
nie będzie - to tam właśnie dla dokładny cel zastąpienia stałych WP!-1
nadaje się do krótkotrwałych procesów. Na przykład kontener konstruktora php używany do uruchamiania testów jednostkowych lub instalator instaluje / etc. Po prostu nie uruchamiaj witryny produkcyjnej z takim ustawieniem.Możesz zwiększyć pamięć dozwoloną dla skryptu php, wykonując następujący wiersz ponad wszystkimi kodami w skrypcie:
A także dezaktywuj niechciane zmienne w skrypcie.
Sprawdź bibliotekę php: Zwalnianie pamięci za pomocą PHP
źródło
źródło
Zauważam, że wiele odpowiedzi po prostu próbuje zwiększyć ilość pamięci przeznaczonej dla skryptu, który ma swoje miejsce, ale najczęściej oznacza to, że coś jest zbyt liberalne w stosunku do pamięci z powodu nieprzewidzianej ilości lub wielkości. Oczywiście, jeśli nie jesteś autorem skryptu, jesteś na łasce autora, chyba że czujesz się ambitny :) Dokumenty PHP twierdzą nawet, że problemy z pamięcią wynikają z „ źle napisanych skryptów ”
Należy wspomnieć, że
ini_set('memory_limit', '-1');
(bez ograniczeń) może powodować niestabilność serwera as0 bytes free = bad things
. Zamiast tego znajdź rozsądną równowagę między tym, co skrypt próbuje zrobić, a ilością dostępnej pamięci na komputerze.Lepsze podejście: jeśli jesteś autorem skryptu (lub ambitnego), możesz debugować takie problemy z pamięcią za pomocą xdebug . Najnowsza wersja (2.6.0 - wydana 29.01.2018) przywróciła profilowanie pamięci, które pokazuje, które wywołania funkcji zużywają duże ilości pamięci. Ujawnia problemy w skrypcie, które w innym przypadku byłyby trudne do znalezienia. Zwykle nieefektywności występują w pętli, która nie oczekuje wielkości, którą otrzymuje, ale każdy przypadek pozostawi czytelnikowi jako ćwiczenie :)
Dokumentacja xdebug jest pomocna, ale sprowadza się do 3 kroków:
apt-get
iyum
itpxdebug.profiler_enable = 1
,xdebug.profiler_output_dir = /where/ever/
źródło
Jeśli próbujesz odczytać plik, zajmie to pamięć w PHP. Na przykład, jeśli próbujesz otworzyć i odczytać plik MP3 (np. $ Data = plik („ http://mydomain.com/path/sample.mp3 ”), wszystko to zapisze w pamięci .
Jak sugeruje Nelson, możesz pracować nad zwiększeniem maksymalnego limitu pamięci, jeśli faktycznie chcesz zużywać tyle pamięci.
źródło
Mieliśmy podobną sytuację i wypróbowaliśmy podane na początku odpowiedzi ini_set ('memory_limit', '-1'); i wszystko działało dobrze, skompresowane pliki obrazów większe niż 1 MB do KB.
źródło
pisać
ini_set('memory_limit', '-1');
w index.php u góry po otwarciu tagu php
źródło
Otrzymałem ten sam komunikat o błędzie po przejściu na nowy motyw w Wordpress. PHP działało w wersji 5.3, więc przełączyłem się na 7.2. To naprawiło problem.
źródło
Jeśli korzystasz z hostingu współdzielonego, nie będziesz w stanie wymusić przyrostu limitu rozmiaru php.
Po prostu przejdź do swojego panelu i zaktualizuj wersję php do wersji 7.1 lub nowszej, a następnie możesz zacząć.
źródło
użytkownicy wordpress dodają wiersz:
@ini_set('memory_limit', '-1');
w wp-settings.php, który można znaleźć w folderze głównym zainstalowanego Wordpress
źródło
Nie odnowiłem hostingu, a baza danych była tylko do odczytu. Joomla musiał napisać sesję i nie mógł tego zrobić.
źródło
Miałem ten sam problem, co uruchamianie php w linii poleceń. Ostatnio miałem zmiany pliku php.ini i popełniłem błąd podczas zmiany php.ini
To jest dla php7.0
Ustawiłem
memory_limit = 256
(co oznacza256 bytes
)zamiast
memory_limit = 256M
(co oznacza256 Mega bytes
).Po poprawieniu mój proces zaczął działać poprawnie.
źródło
Uruchom to polecenie w katalogu głównym Magento
php -d memory_limit=4G bin/magento
źródło
jeśli używasz laravel, użyj tych sposobów
public function getClientsListApi(Request $request){ print_r($request->all()); //for all request print_r($request->name); //for all name }
zamiast
public function getClientsListApi(Request $request){ print_r($request); // it show error as above mention }
źródło