Nagle mam problemy z moją aplikacją, których nigdy wcześniej nie miałem. Zdecydowałem się sprawdzić dziennik błędów Apache i znalazłem komunikat o błędzie „zend_mm_heap uszkodzony”. Co to znaczy.
System operacyjny: Fedora Core 8 Apache: 2.2.9 PHP: 5.2.6
php
heap
fedora
php-internals
bkulyk
źródło
źródło
USE_ZEND_ALLOC=0
pobierałem ślad stosu w dzienniku błędów I znalazłem błąd/usr/sbin/httpd: corrupted double-linked list
, dowiedziałem się, że komentowanieopcache.fast_shutdown=1
działało dla mnie.Odpowiedzi:
Po wielu próbach i błędach stwierdziłem, że jeśli
output_buffering
zwiększę wartość w pliku php.ini, ten błąd zniknieźródło
Nie jest to problem, który można koniecznie rozwiązać poprzez zmianę opcji konfiguracyjnych.
Zmiana opcji konfiguracji będzie czasami miała pozytywny wpływ, ale równie łatwo może pogorszyć sytuację lub w ogóle nic nie robić.
Natura błędu jest następująca:
Powyższy kod można skompilować za pomocą:
Wykonując kod za pomocą valgrind można zobaczyć wiele błędów pamięci, których kulminacją jest błąd segmentacji:
Jeśli nie wiedziałeś, już zorientowałeś się, że
mem
jest to pamięć przydzielona na stos; Sterta odnosi się do obszaru pamięci dostępnego dla programu w czasie wykonywania, ponieważ program jawnie go zażądał (w naszym przypadku z malloc).Jeśli będziesz bawić się okropnym kodem, okaże się, że nie wszystkie z tych oczywiście niepoprawnych instrukcji powodują błąd segmentacji (krytyczny błąd zakończenia).
Jawnie popełniłem te błędy w przykładowym kodzie, ale te same rodzaje błędów zdarzają się bardzo łatwo w środowisku zarządzanym pamięcią: jeśli jakiś kod nie obsługuje liczby referencyjnej zmiennej (lub innego symbolu) we właściwy sposób, na przykład jeśli zwolni to za wcześnie, inny fragment kodu może odczytać z już wolnej pamięci, jeśli w jakiś sposób zapisze nieprawidłowy adres, inny fragment kodu może zapisać do niewłaściwej pamięci, może być zwolniony dwukrotnie ...
Nie są to problemy, które można debugować w PHP, absolutnie wymagają one uwagi wewnętrznego programisty.
Sposób postępowania powinien być:
Może nie być żadnego zysku ... Powiedziałem na początku, że możesz być w stanie znaleźć sposób na zmianę swoich objawów, mieszając konfigurację, ale jest to bardzo trafione i chybione i nie pomaga następnym razem ta sama
zend_mm_heap corrupted
wiadomość, jest tylko tyle opcji konfiguracyjnych.Naprawdę ważne jest, abyśmy tworzyli raporty o błędach, gdy znajdziemy błędy, nie możemy zakładać, że zrobi to następna osoba, która trafi błąd ... bardziej prawdopodobne, że rzeczywista rozdzielczość nie jest w żaden sposób tajemnicza, jeśli zrobisz właściwi ludzie świadomi problemu.
USE_ZEND_ALLOC
Jeśli ustawisz
USE_ZEND_ALLOC=0
w środowisku, wyłącza to własnego menedżera pamięci Zend; Menedżer pamięci Zend zapewnia, że każde żądanie ma własną stertę, że cała pamięć jest zwolniona na końcu żądania i jest zoptymalizowany pod kątem przydzielania fragmentów pamięci o rozmiarze odpowiednim dla PHP.Wyłączenie go wyłączy te optymalizacje, co ważniejsze, prawdopodobnie spowoduje wycieki pamięci, ponieważ istnieje wiele kodów rozszerzeń, które zależą od Zend MM, aby zwolnić pamięć dla nich pod koniec żądania (tut, tut).
Może również ukryć objawy, ale sterta systemowa może zostać uszkodzona dokładnie w taki sam sposób, jak sterta Zend.
To może wydawać się być bardziej tolerancyjne lub mniej tolerancyjny, ale ustalić przyczynę problemu, to nie mogę .
Możliwość wyłączenia go w ogóle jest korzystna dla programistów wewnętrznych; Nigdy nie powinieneś wdrażać PHP z wyłączonym Zend MM.
źródło
Otrzymałem ten sam błąd w PHP 5.5 i zwiększenie buforowania wyjścia nie pomogło. Nie korzystałem też z APC, więc to nie był problem. W końcu wyśledziłem go do opcache , po prostu musiałem go wyłączyć z CLI. Było do tego określone ustawienie:
Po przełączeniu błąd zend_mm_heap uszkodzony zniknął.
źródło
Jeśli korzystasz z Linuksa, spróbuj tego w wierszu poleceń
źródło
/etc/apache2/envvars
jeśli uruchamiasz to na serwerze ubuntu z apache i php zainstalowanym z ppas (apt). PHP 7.0-RC4 zaczął generować ten błąd, gdy instalowałem go z repozytorium ondrej.set USE_ZEND_ALLOC=0
Sprawdź
unset()
s. Upewnij się, że nie używaszunset()
odniesień do$this
(lub odpowiedników) w destruktorach i tounset()
w destruktorach nie powoduje spadku liczby odwołań do tego samego obiektu do 0. Zrobiłem kilka badań i odkryłem, że to zwykle powoduje stertę korupcja.Istnieje raport o błędzie PHP dotyczący błędu zend_mm_heap uszkodzony . Zobacz komentarz,
[2011-08-31 07:49 UTC] f dot ardelian at gmail dot com
aby zobaczyć przykład, jak go odtworzyć.Mam wrażenie, że wszystkie inne „rozwiązania” (zmiana
php.ini
, kompilacja PHP ze źródła z mniejszą liczbą modułów itp.) Po prostu ukrywają problem.źródło
Dla mnie żadna z poprzednich odpowiedzi nie działała, dopóki nie spróbowałem:
Jak dotąd to wydaje się działać.
Używam PHP 5.6 z PHP-FPM i Apache proxy_fcgi, jeśli to ma znaczenie ...
źródło
W moim przypadku przyczyną tego błędu było to, że jedna z tablic stawała się bardzo duża. Ustawiłem mój skrypt tak, aby resetował tablicę przy każdej iteracji i to rozwiązało problem.
źródło
Zgodnie z narzędziem do śledzenia błędów, ustaw
opcache.fast_shutdown=0
. Szybkie zamykanie używa menedżera pamięci Zend do porządkowania bałaganu, to wyłącza to.źródło
Myślę, że nie ma tu jednej odpowiedzi, więc dodam moje doświadczenie. Widziałem ten sam błąd wraz z losowymi segfaultami httpd. To był serwer cPanel. Omawianym symptomem było to, że apache losowo resetował połączenie (brak danych otrzymanych w przeglądarce Chrome lub połączenie zostało zresetowane w przeglądarce Firefox). Były pozornie przypadkowe - przez większość czasu działało, czasami nie.
Kiedy dotarłem na scenę, buforowanie wyjścia było WYŁĄCZONE. Czytając ten wątek, który wskazywał na buforowanie wyjścia, włączyłem go (= 4096), aby zobaczyć, co się stanie. W tym momencie wszyscy zaczęli pokazywać błędy. To dobrze, że błąd był teraz powtarzalny.
Przeszedłem i zacząłem wyłączać rozszerzenia. Wśród nich eaccellerator, pdo, ioncube loader i wiele innych, które wyglądały na podejrzane, ale nic nie pomogło.
W końcu znalazłem niegrzeczne rozszerzenie PHP jako „homeloader.so”, które wydaje się być czymś w rodzaju modułu cPanel-easy-installer. Po usunięciu nie miałem żadnych innych problemów.
W tej notatce wygląda na to, że jest to ogólny komunikat o błędzie, więc Twój przebieg będzie się różnić w przypadku wszystkich tych odpowiedzi, najlepszy sposób działania, jaki możesz podjąć:
W przypadku niepowodzenia wszystkich powyższych, możesz również spróbować następujących rzeczy:
Powodzenia.
źródło
Zmagałem się z tym problemem przez tydzień, to zadziałało dla mnie, a przynajmniej tak się wydaje
W
php.ini
dokonać tych zmianMoja konfiguracja to
To nie zadziałało.
Więc spróbowałem użyć skryptu testowego i spróbowałem nagrać, gdzie skrypt się rozłącza. Odkryłem, że tuż przed wystąpieniem błędu została utworzona instancja obiektu php i ukończenie tego, co obiekt miał zrobić, zajęło ponad 3 sekundy, podczas gdy w poprzednich pętlach trwało to maksymalnie 0,4 sekundy. Przeprowadziłem ten test kilka razy i za każdym razem tak samo. Pomyślałem, że zamiast tworzyć nowy obiekt za każdym razem (jest tu długa pętla), powinienem ponownie użyć obiektu. Do tej pory testowałem skrypt kilkanaście razy i zniknęły błędy pamięci!
źródło
Poszukaj dowolnego modułu, który używa buforowania, i wyłącz go selektywnie.
Używam PHP 5.3.5 na CentOS 4.8 i po wykonaniu tej czynności stwierdziłem, że eaccelerator wymaga aktualizacji.
źródło
Właśnie miałem ten problem na serwerze, który posiadam, a główną przyczyną był APC. Skomentowałem rozszerzenie „apc.so” w pliku php.ini, ponownie załadowałem Apache i strony od razu zaczęły działać.
źródło
Próbowałem wszystkiego powyżej i
zend.enable_gc = 0
- jedyne ustawienie konfiguracji, które mi pomogło.PHP 5.3.10-1ubuntu3.2 z Suhosin-Patch (cli) (zbudowany: 13 czerwca 2012 17:19:58)
źródło
Wystąpił ten błąd podczas korzystania ze sterownika Mongo 2.2 dla PHP:
^^ NIE DZIAŁA
^^ DZIAŁA! (?!)
źródło
foreach(selectCollection()->find()) { $arr = .. }
W PHP 5.3, po wielu poszukiwaniach, oto rozwiązanie, które zadziałało:
Mam wyłączone zbieranie śmieci PHP na tej stronie, dodając:
do końca problematycznej strony, przez co wszystkie błędy zniknęły.
źródło .
źródło
Myślę, że wiele powodów może powodować ten problem. W moim przypadku nazywam 2 klasy o tej samej nazwie, a jedna spróbuje załadować inną.
I to powoduje ten problem w moim przypadku.
(Używając laravel framework, uruchamiając php artisan db: seed w rzeczywistości)
źródło
Miałem ten sam problem i kiedy miałem nieprawidłowy adres IP dla session.save_path dla sesji memcached. Zmiana adresu IP na poprawny rozwiązała problem.
źródło
Jeśli używasz cech, a cecha jest ładowana po klasie (np. W przypadku automatycznego ładowania), musisz wcześniej załadować cechę.
https://bugs.php.net/bug.php?id=62339
Uwaga: ten błąd jest bardzo losowy; ze względu na swoją naturę.
źródło
U mnie problemem był pdo_mysql. Zapytanie zwróciło 1960 wyników. Próbowałem zwrócić 1900 płyt i działa. Problemem jest więc pdo_mysql i zbyt duża tablica. Przepisałem zapytanie z oryginalnym rozszerzeniem mysql i zadziałało.
Apache nie zgłosił żadnych poprzednich błędów.
źródło
„Zend_mm_heap uszkodzony” oznacza problemy z zarządzaniem pamięcią. Może być spowodowane przez dowolny moduł PHP. W moim przypadku instalacja APC się powiodła. Teoretycznie mogą pomóc również inne pakiety, takie jak eAccelerator, XDebug itp. Lub, jeśli masz zainstalowane tego rodzaju moduły, spróbuj je wyłączyć.
źródło
Piszę rozszerzenie php i również napotykam ten problem. Kiedy wywołuję funkcję extern ze skomplikowanymi parametrami z mojego rozszerzenia, pojawia się ten błąd.
Powodem jest to, że nie przydzielam pamięci dla parametru (char *) w funkcji extern. Jeśli piszesz rozszerzenie tego samego rodzaju, zwróć na to uwagę.
źródło
Dla mnie to ZendDebugger spowodował wyciek pamięci i spowodował awarię MemoryManagera.
Wyłączyłem go i obecnie szukam nowszej wersji. Jeśli nie mogę znaleźć, przełączę się na xdebug ...
źródło
Ponieważ nigdy nie znalazłem rozwiązania tego problemu, zdecydowałem się zaktualizować moje środowisko LAMP. Poszedłem do Ubuntu 10.4 LTS z PHP 5.3.x. Wydaje się, że to zatrzymało problem.
źródło
W moim przypadku zapomniałem w kodzie:
Bawiłem się i zapomniałem o tym w kodzie tu i ówdzie - w niektórych miejscach dostałem uszkodzenie stosu, niektóre przypadki po prostu zwykły stary błąd:
Jestem na Macu 10.6.7 i Xampp.
źródło
Zauważyłem również ten błąd i SIGSEGV podczas uruchamiania starego kodu, który używa znaku „&” do jawnego wymuszania odwołań podczas uruchamiania go w PHP 5.2+.
źródło
Oprawa
w php.ini pomogło mi (wyłączyło asercje typu w
php5UTF8
bibliotece izend_mm_heap corrupted
odeszło)źródło
Dla mnie problem polegał na awarii demona memcached, ponieważ PHP zostało skonfigurowane do przechowywania informacji o sesji w memcached. Zjadał 100% procesora i dziwnie się zachowywał. Po ponownym uruchomieniu memcached zniknął problem.
źródło
Ponieważ żadna z pozostałych odpowiedzi nie rozwiązała tego problemu, miałem ten problem w php 5.4, gdy przypadkowo uruchomiłem nieskończoną pętlę.
źródło
Kilka wskazówek, które mogą komuś pomóc
fedora 20, php 5.5.18
użycie var_dummp () w rzeczywistości nie jest błędem, zostało umieszczone tylko w celu debugowania i zostanie usunięte w kodzie produkcyjnym. Ale prawdziwe miejsce, w którym wydarzyło się zend_mm_heap, to drugie miejsce.
źródło
Byłem w tej samej sytuacji tutaj nic powyżej nie pomogło, a sprawdzając poważniej znajduję swój problem, polega na try do die (header ()) po wysłaniu jakiegoś wyjścia do bufora, człowiek który to zrobił w kodzie zapomniał o zasobach CakePHP i nie wykonał prostego polecenia „return $ this-> redirect ($ url)”.
Na tym polegał problem, próbując wymyślić na nowo studnię.
Mam nadzieję, że ten związek komuś pomoże!
źródło