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
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
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ół.
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
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 ...
Robić :
ini_set('memory_limit', '-1');
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.
$path = 'path_to_file_.txt';
$file = fopen($path, 'r');
$len = 1024; // 1MB is reasonable for me. You can choose anything though, but do not make it too big
$output = fread( $file, $len );
while (!feof($file)) {
$output .= fread( $file, $len );
}
fclose($file);
echo 'Output is: ' . $output;
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życie while()
pętli do pobierania i przetwarzania jednego wiersza na raz. To samo dotyczy przetwarzania pliku.
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
.
$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.
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 przyjdziesz WP_MEMORY_LIMIT
i WP_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.
// Define memory limits.
if ( ! defined( 'WP_MEMORY_LIMIT' ) ) {
if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
define( 'WP_MEMORY_LIMIT', $current_limit );
} elseif ( is_multisite() ) {
define( 'WP_MEMORY_LIMIT', '200M' );
} else {
define( 'WP_MEMORY_LIMIT', '128M' );
}
}
if ( ! defined( 'WP_MAX_MEMORY_LIMIT' ) ) {
if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
} elseif ( -1 === $current_limit_int || $current_limit_int > 268435456 /* = 256M */ ) {
define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
} else {
define( 'WP_MAX_MEMORY_LIMIT', '256M' );
}
}
Przy okazji, nie rób następującego kodu, ponieważ to zła praktyka:
ini_set('memory_limit', '-1');
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 .e define( 'WP_MEMORY_LIMIT', '200M' );
i define( 'WP_MAX_MEMORY_LIMIT', '256M' );
. W przeciwieństwie do plików na „core” WP (mianowicie, wszystko pod wp-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:
ini_set('memory_limit','-1'); // enabled the full memory available.
A także dezaktywuj niechciane zmienne w skrypcie.
Sprawdź bibliotekę php: Zwalnianie pamięci za pomocą PHP
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 as 0 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
i yum
itpxdebug.profiler_enable = 1
,xdebug.profiler_output_dir = /where/ever/
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.
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.
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ąć.
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
Nie odnowiłem hostingu, a baza danych była tylko do odczytu. Joomla musiał napisać sesję i nie mógł tego zrobić.
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
ścieżka do php.ini, w której popełniłem błąd:
/etc/php/7.0/cli/php.ini
Ustawiłem memory_limit = 256
(co oznacza 256 bytes
)
zamiast memory_limit = 256M
(co oznacza 256 Mega bytes
).
; Maksymalna ilość pamięci, którą skrypt może zużyć (128 MB)
; http://php.net/memory-limit
memory_limit = 128M
Po poprawieniu mój proces zaczął działać poprawnie.
Uruchom to polecenie w katalogu głównym Magento php -d memory_limit=4G bin/magento
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
}