Plötzlich hatte ich Probleme mit meiner Anwendung, die ich noch nie zuvor hatte. Ich habe beschlossen, das Fehlerprotokoll des Apache zu überprüfen, und eine Fehlermeldung mit dem Titel "zend_mm_heap beschädigt" gefunden. Was bedeutet das.
Betriebssystem: Fedora Core 8 Apache: 2.2.9 PHP: 5.2.6
php
heap
fedora
php-internals
bkulyk
quelle
quelle
USE_ZEND_ALLOC=0
die Stapelverfolgung im Fehlerprotokoll abgerufen und den Fehler gefunden/usr/sbin/httpd: corrupted double-linked list
. Ich habe herausgefunden, dass das Auskommentierenopcache.fast_shutdown=1
für mich funktioniert hat.Antworten:
Nach
output_buffering
langem Ausprobieren stellte ich fest, dass dieser Fehler verschwindet , wenn ich den Wert in der Datei php.ini erhöhequelle
Dies ist kein Problem, das unbedingt durch Ändern der Konfigurationsoptionen gelöst werden kann.
Das Ändern von Konfigurationsoptionen wirkt sich manchmal positiv aus, kann aber genauso gut die Situation verschlimmern oder gar nichts bewirken.
Die Art des Fehlers ist folgende:
Der obige Code kann kompiliert werden mit:
Wenn Sie den Code mit valgrind ausführen, werden viele Speicherfehler angezeigt, die in einem Segmentierungsfehler gipfeln:
Wenn Sie es nicht wussten, haben Sie bereits herausgefunden, dass dem
mem
Heap Speicher zugewiesen ist. Der Heap bezieht sich auf den Speicherbereich, der dem Programm zur Laufzeit zur Verfügung steht, da das Programm dies explizit angefordert hat (in unserem Fall mit malloc).Wenn Sie mit dem schrecklichen Code herumspielen, werden Sie feststellen, dass nicht alle dieser offensichtlich falschen Anweisungen zu einem Segmentierungsfehler führen (ein schwerwiegender Beendigungsfehler).
Ich habe diese Fehler explizit im Beispielcode gemacht, aber die gleichen Arten von Fehlern treten in einer speicherverwalteten Umgebung sehr leicht auf: Wenn ein Code beispielsweise die Nachzählung einer Variablen (oder eines anderen Symbols) nicht auf die richtige Weise beibehält Wenn es zu früh freigegeben wird, kann ein anderes Stück Code aus dem bereits freigegebenen Speicher gelesen werden. Wenn es die falsche Adresse irgendwie speichert, kann ein anderes Stück Code in einen ungültigen Speicher schreiben, es kann zweimal freigegeben werden ...
Dies sind keine Probleme, die in PHP behoben werden können. Sie erfordern unbedingt die Aufmerksamkeit eines internen Entwicklers.
Die Vorgehensweise sollte sein:
Es kann sein, dass es keinen Gewinn gibt ... Ich sagte zu Beginn, dass Sie möglicherweise einen Weg finden können, Ihre Symptome zu ändern, indem Sie mit der Konfiguration herumspielen, aber dies ist ein großer Erfolg und Misserfolg und hilft beim nächsten Mal nicht weiter die gleiche
zend_mm_heap corrupted
Meldung, es gibt nur so viele Konfigurationsmöglichkeiten.Es ist wirklich wichtig, dass wir Fehlerberichte erstellen, wenn wir Fehler finden. Wir können nicht davon ausgehen, dass die nächste Person, die den Fehler entdeckt, dies tun wird. Wahrscheinlich ist die tatsächliche Lösung in keiner Weise mysteriös, wenn Sie die Fehler beheben richtige Leute, die sich des Problems bewusst sind.
USE_ZEND_ALLOC
Wenn Sie
USE_ZEND_ALLOC=0
in der Umgebung festlegen , wird der eigene Speichermanager von Zend deaktiviert. Der Speichermanager von Zend stellt sicher, dass jede Anforderung einen eigenen Heap hat, dass der gesamte Speicher am Ende einer Anforderung frei ist und für die Zuweisung von Speicherblöcken optimiert ist, die genau die richtige Größe für PHP haben.Durch Deaktivieren werden diese Optimierungen deaktiviert, was noch wichtiger ist, es wird wahrscheinlich zu Speicherlecks kommen, da es viele Erweiterungscodes gibt, die darauf beruhen, dass das Zend MM am Ende einer Anforderung (tut, tut) Speicher für sie freigibt.
Es kann auch die Symptome verbergen , aber der System-Heap kann genauso beschädigt werden wie der Zend-Heap.
Es mag toleranter oder weniger tolerant erscheinen, aber die Hauptursache des Problems kann nicht behoben werden .
Die Möglichkeit, es überhaupt zu deaktivieren, kommt den internen Entwicklern zugute. Sie sollten PHP niemals mit deaktiviertem Zend MM bereitstellen.
quelle
Ich habe den gleichen Fehler unter PHP 5.5 erhalten und das Erhöhen der Ausgabepufferung hat nicht geholfen. Ich habe APC auch nicht ausgeführt, also war das nicht das Problem. Ich habe es schließlich auf opcache aufgespürt , ich musste es einfach aus dem cli deaktivieren. Hierfür gab es eine spezielle Einstellung:
Nach dem Umschalten verschwand der beschädigte Fehler zend_mm_heap.
quelle
Wenn Sie unter Linux arbeiten, versuchen Sie dies in der Befehlszeile
quelle
/etc/apache2/envvars
wenn Sie dies auf einem Ubuntu-Server ausführen, auf dem sowohl Apache als auch PHP von ppas (apt) installiert sind. PHP 7.0-RC4 hat diesen Fehler ausgelöst, als ich ihn aus dem Repository von ondrej installiert habe.set USE_ZEND_ALLOC=0
Überprüfen Sie auf
unset()
s. Stellen Sie sicher, dass Sie in Destruktoren nichtunset()
auf die$this
(oder Entsprechungen) verweisen und dass diesunset()
in Destruktoren nicht dazu führt, dass die Referenzanzahl auf dasselbe Objekt auf 0 fällt. Ich habe einige Nachforschungen angestellt und festgestellt, dass dies normalerweise den Heap verursacht Korruption.Es gibt einen PHP-Fehlerbericht über den beschädigten Fehler zend_mm_heap . Im Kommentar finden Sie
[2011-08-31 07:49 UTC] f dot ardelian at gmail dot com
ein Beispiel für die Reproduktion.Ich habe das Gefühl, dass alle anderen "Lösungen" (Ändern
php.ini
, Kompilieren von PHP aus dem Quellcode mit weniger Modulen usw.) das Problem nur verbergen.quelle
Für mich funktionierte keine der vorherigen Antworten, bis ich versuchte:
Das scheint soweit zu funktionieren.
Ich verwende PHP 5.6 mit PHP-FPM und Apache proxy_fcgi, wenn das wichtig ist ...
quelle
In meinem Fall war die Ursache für diesen Fehler, dass eines der Arrays sehr groß wurde. Ich habe mein Skript so eingestellt, dass das Array bei jeder Iteration zurückgesetzt wird, und das hat das Problem behoben.
quelle
Stellen Sie gemäß dem Bug-Tracker ein
opcache.fast_shutdown=0
. Beim schnellen Herunterfahren wird der Zend-Speichermanager verwendet, um das Durcheinander zu beseitigen. Dadurch wird dies deaktiviert.quelle
Ich glaube nicht, dass es hier eine Antwort gibt, also werde ich meine Erfahrung hinzufügen. Ich habe den gleichen Fehler zusammen mit zufälligen httpd-Segfaults gesehen. Dies war ein cPanel-Server. Das fragliche Symptom war, dass Apache die Verbindung zufällig zurücksetzen würde (Keine Daten in Chrome empfangen oder Verbindung in Firefox zurückgesetzt). Diese waren scheinbar zufällig - die meiste Zeit funktionierte es, manchmal nicht.
Als ich in der Szene ankam, war die Ausgangspufferung AUS. Durch Lesen dieses Threads, der auf eine Ausgabepufferung hindeutete, schaltete ich ihn ein (= 4096), um zu sehen, was passieren würde. Zu diesem Zeitpunkt zeigten alle die Fehler. Das war gut so, dass der Fehler jetzt wiederholbar war.
Ich ging durch und begann Erweiterungen zu deaktivieren. Unter ihnen, eaccellerator, pdo, ioncube loader und viele, die verdächtig aussahen , aber keiner half.
Endlich fand ich die freche PHP-Erweiterung als "homeloader.so", die eine Art cPanel-easy-Installer-Modul zu sein scheint. Nach dem Entfernen sind keine weiteren Probleme aufgetreten.
In diesem Sinne scheint es sich um eine allgemeine Fehlermeldung zu handeln, sodass Ihre Laufleistung mit all diesen Antworten variiert. Die beste Vorgehensweise, die Sie ergreifen können:
Wenn Sie alle oben genannten Punkte nicht erfüllen, können Sie auch Folgendes ausprobieren:
Viel Glück.
quelle
Ich habe eine Woche lang mit diesem Thema gerungen. Das hat bei mir funktioniert, oder zumindest so, wie es scheint
In
php.ini
machen diese ÄnderungenMein Setup ist
Das hat nicht funktioniert.
Also habe ich versucht, ein Benchmark-Skript zu verwenden und aufzuzeichnen, wo das Skript aufgelegt hat. Ich entdeckte, dass kurz vor dem Fehler ein PHP-Objekt instanziiert wurde und es mehr als 3 Sekunden dauerte, bis das Objekt fertig war, während es in den vorherigen Schleifen maximal 0,4 Sekunden dauerte. Ich habe diesen Test einige Male durchgeführt und jedes Mal das gleiche. Ich dachte, anstatt jedes Mal ein neues Objekt zu erstellen (hier gibt es eine lange Schleife), sollte ich das Objekt wiederverwenden. Ich habe das Skript bisher mehr als ein Dutzend Mal getestet und die Speicherfehler sind verschwunden!
quelle
Suchen Sie nach Modulen, die Pufferung verwenden, und deaktivieren Sie sie selektiv.
Ich verwende PHP 5.3.5 unter CentOS 4.8 und habe danach festgestellt, dass eaccelerator ein Upgrade benötigt.
quelle
Ich hatte dieses Problem auch auf einem Server, den ich besitze, und die Hauptursache war APC. Ich habe die Erweiterung "apc.so" in der Datei "php.ini" auskommentiert, Apache neu geladen und die Websites wurden sofort wieder hergestellt.
quelle
Ich habe alles oben versucht und
zend.enable_gc = 0
- die einzige Konfigurationseinstellung, die mir geholfen hat.PHP 5.3.10-1ubuntu3.2 mit Suhosin-Patch (cli) (erstellt: 13. Juni 2012, 17:19:58 Uhr)
quelle
Ich hatte diesen Fehler mit dem Mongo 2.2-Treiber für PHP:
^^ FUNKTIONIERT NICHT
^^ FUNKTIONIERT! (?!)
quelle
foreach(selectCollection()->find()) { $arr = .. }
Unter PHP 5.3 ist dies nach langem Suchen die Lösung, die für mich funktioniert hat:
Ich habe die PHP-Garbage Collection für diese Seite deaktiviert, indem ich Folgendes hinzugefügt habe:
bis zum Ende der problematischen Seite, wodurch alle Fehler verschwanden.
Quelle .
quelle
Ich denke, viele Gründe können dieses Problem verursachen. Und in meinem Fall nenne ich 2 Klassen den gleichen Namen, und eine wird versuchen, eine andere zu laden.
Und es verursacht dieses Problem in meinem Fall.
(Verwenden des Laravel-Frameworks, Ausführen von PHP Artisan DB: Seed in Real)
quelle
Ich hatte das gleiche Problem und als ich eine falsche IP für session.save_path für gespeicherte Sitzungen hatte. Durch Ändern der richtigen IP-Adresse wurde das Problem behoben.
quelle
Wenn Sie Merkmale verwenden und das Merkmal nach der Klasse geladen wird (dh im Fall des automatischen Ladens), müssen Sie das Merkmal vorher laden.
https://bugs.php.net/bug.php?id=62339
Hinweis: Dieser Fehler ist sehr, sehr zufällig. aufgrund seiner Natur.
quelle
Für mich war das Problem die Verwendung von pdo_mysql. Die Abfrage ergab die Ergebnisse von 1960. Ich habe versucht, 1900 Datensätze zurückzugeben, und es funktioniert. Das Problem ist also pdo_mysql und ein zu großes Array. Ich habe die Abfrage mit der ursprünglichen MySQL-Erweiterung umgeschrieben und es hat funktioniert.
Apache hat keine vorherigen Fehler gemeldet.
quelle
"zend_mm_heap beschädigt" bedeutet Probleme mit der Speicherverwaltung. Kann durch jedes PHP-Modul verursacht werden. In meinem Fall hat die Installation von APC geklappt. Theoretisch können auch andere Pakete wie eAccelerator, XDebug usw. helfen. Wenn Sie diese Art von Modulen installiert haben, schalten Sie sie aus.
quelle
Ich schreibe eine PHP-Erweiterung und stoße auch auf dieses Problem. Wenn ich eine externe Funktion mit komplizierten Parametern aus meiner Erweiterung aufrufe, wird dieser Fehler angezeigt.
Der Grund ist, dass ich keinen Speicher für einen Parameter (char *) in der externen Funktion reserviere. Wenn Sie dieselbe Art von Erweiterung schreiben, beachten Sie dies bitte.
quelle
Für mich war es der ZendDebugger, der den Speicherverlust verursachte und den MemoryManager zum Absturz brachte.
Ich habe es deaktiviert und suche derzeit nach einer neueren Version. Wenn ich keinen finde, wechsle ich zu xdebug ...
quelle
Da ich nie eine Lösung dafür gefunden habe, habe ich beschlossen, meine LAMP-Umgebung zu aktualisieren. Ich ging mit PHP 5.3.x zu Ubuntu 10.4 LTS. Dies scheint das Problem für mich gestoppt zu haben.
quelle
In meinem Fall habe ich Folgendes im Code vergessen:
Ich habe hier und da herumgespielt und es im Code vergessen - an einigen Stellen habe ich Heap-Korruption bekommen, in einigen Fällen einfach nur ein alter Fehler:
Ich bin auf Mac 10.6.7 und Xampp.
quelle
Ich habe diesen Fehler und SIGSEGVs auch beim Ausführen von altem Code bemerkt, der '&' verwendet, um Verweise explizit zu erzwingen, während er in PHP 5.2+ ausgeführt wird.
quelle
Rahmen
in php.ini hat mir geholfen (es hat Typzusicherungen in der
php5UTF8
Bibliothek deaktiviert und ist weggegangenzend_mm_heap corrupted
)quelle
Für mich war das Problem abgestürzter memcached Daemon, da PHP so konfiguriert war, dass Sitzungsinformationen in memcached gespeichert werden. Es aß 100% CPU und benahm sich komisch. Nach dem memcached Neustart ist das Problem behoben.
quelle
Da keine der anderen Antworten darauf einging, hatte ich dieses Problem in PHP 5.4, als ich versehentlich eine Endlosschleife ausführte.
quelle
Einige Tipps, die jemandem helfen können
Fedora 20, PHP 5.5.18
mit var_dummp () ist eigentlich kein Fehler, es wurde nur zum Debuggen platziert und wird im Produktionscode entfernt. Aber der wirkliche Ort, an dem zend_mm_heap passiert ist, ist der zweite Ort.
quelle
Ich war hier in der gleichen Situation, nichts oben hat geholfen, und wenn ich es ernsthafter überprüfe, finde ich mein Problem. Es besteht darin, zu versuchen, zu sterben (header ()), nachdem ich eine Ausgabe an den Puffer gesendet habe. Der Mann, der dies im Code getan hat, hat die CakePHP-Ressourcen vergessen und machte kein simples "return $ this-> redirect ($ url)".
Der Versuch, den Brunnen neu zu erfinden, war das Problem.
Ich hoffe diese Beziehung hilft jemandem!
quelle