Was bedeutet "zend_mm_heap beschädigt"?


126

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


2
Ich habe USE_ZEND_ALLOC=0die Stapelverfolgung im Fehlerprotokoll abgerufen und den Fehler gefunden /usr/sbin/httpd: corrupted double-linked list. Ich habe herausgefunden, dass das Auskommentieren opcache.fast_shutdown=1für mich funktioniert hat.
Spidfire

Ja, das gleiche hier. Siehe auch einen anderen Bericht weiter unten stackoverflow.com/a/35212026/35946
lkraav

Ich hatte das gleiche mit Laravel. Ich habe eine Klasse in den Konstruktor einer anderen Klasse eingefügt. Die Klasse, die ich injizierte, injizierte die Klasse, in die sie injiziert wurde, und erstellte im Grunde genommen einen Zirkelverweis, der das Heap-Problem verursachte.
Thomas

1
Starten Sie den Apache-Server neu, um schnellste und vorübergehende Lösungen zu erhalten :)
Leopathu

Antworten:


52

Nach output_bufferinglangem Ausprobieren stellte ich fest, dass dieser Fehler verschwindet , wenn ich den Wert in der Datei php.ini erhöhe


59
Auf was erhöhen? Warum würde diese Änderung dazu führen, dass dieser Fehler verschwindet?
JDS

2
@JDS diese Antwort hilft zu erklären, was output_buffering ist und warum eine Erhöhung helfen kann stackoverflow.com/a/2832179/704803
andrewtweber

8
@andrewtweber Ich weiß, was ob ist, ich habe mich über die spezifischen Details gewundert, die in der Antwort von dsmithers nicht berücksichtigt wurden, da ich die gleiche Fehlermeldung wie die Operation hatte. Zum Abschluss: Es stellte sich heraus, dass mein Problem eine falsch konfigurierte Einstellung in Bezug auf Memcached war. Trotzdem danke!
JDS

@JDS welche falsch konfigurierte Einstellung?
Kyle Cronin

3
@KyleCronin Unsere Serviceplattform verwendet Memcache in der Produktion. Einige einzelne Instanzen - Nicht-Produktion / Sandbox, einmalige Kunden - verwenden jedoch keinen Memcache. Im letzteren Fall wurde eine Konfiguration einmalig von der Produktion auf einen Kunden kopiert, und die Memcache-Konfiguration zeigte einen Memcache-Server-URI an, der in dieser Umgebung nicht verfügbar war. Ich habe die Zeile gelöscht und den Memcache in der App deaktiviert, und das Problem ist behoben. Kurz gesagt, ein sehr spezifisches Problem, das in einer bestimmten Umgebung auftritt und möglicherweise nicht allgemein anwendbar ist. Aber seit du gefragt hast ...
JDS

47

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:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void) {
    void **mem = malloc(sizeof(char)*3);
    void *ptr;

    /* read past end */
    ptr = (char*) mem[5];   

    /* write past end */
    memcpy(mem[5], "whatever", sizeof("whatever"));

    /* free invalid pointer */
    free((void*) mem[3]);

    return 0;
}

Der obige Code kann kompiliert werden mit:

gcc -g -o corrupt corrupt.c

Wenn Sie den Code mit valgrind ausführen, werden viele Speicherfehler angezeigt, die in einem Segmentierungsfehler gipfeln:

krakjoe@fiji:/usr/src/php-src$ valgrind ./corrupt
==9749== Memcheck, a memory error detector
==9749== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==9749== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==9749== Command: ./corrupt
==9749== 
==9749== Invalid read of size 8
==9749==    at 0x4005F7: main (an.c:10)
==9749==  Address 0x51fc068 is 24 bytes after a block of size 16 in arena "client"
==9749== 
==9749== Invalid read of size 8
==9749==    at 0x400607: main (an.c:13)
==9749==  Address 0x51fc068 is 24 bytes after a block of size 16 in arena "client"
==9749== 
==9749== Invalid write of size 2
==9749==    at 0x4C2F7E3: memcpy@@GLIBC_2.14 (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==9749==    by 0x40061B: main (an.c:13)
==9749==  Address 0x50 is not stack'd, malloc'd or (recently) free'd
==9749== 
==9749== 
==9749== Process terminating with default action of signal 11 (SIGSEGV): dumping core
==9749==  Access not within mapped region at address 0x50
==9749==    at 0x4C2F7E3: memcpy@@GLIBC_2.14 (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==9749==    by 0x40061B: main (an.c:13)
==9749==  If you believe this happened as a result of a stack
==9749==  overflow in your program's main thread (unlikely but
==9749==  possible), you can try to increase the size of the
==9749==  main thread stack using the --main-stacksize= flag.
==9749==  The main thread stack size used in this run was 8388608.
==9749== 
==9749== HEAP SUMMARY:
==9749==     in use at exit: 3 bytes in 1 blocks
==9749==   total heap usage: 1 allocs, 0 frees, 3 bytes allocated
==9749== 
==9749== LEAK SUMMARY:
==9749==    definitely lost: 0 bytes in 0 blocks
==9749==    indirectly lost: 0 bytes in 0 blocks
==9749==      possibly lost: 0 bytes in 0 blocks
==9749==    still reachable: 3 bytes in 1 blocks
==9749==         suppressed: 0 bytes in 0 blocks
==9749== Rerun with --leak-check=full to see details of leaked memory
==9749== 
==9749== For counts of detected and suppressed errors, rerun with: -v
==9749== ERROR SUMMARY: 4 errors from 3 contexts (suppressed: 0 from 0)
Segmentation fault

Wenn Sie es nicht wussten, haben Sie bereits herausgefunden, dass dem memHeap 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:

  1. Öffnen Sie einen Fehlerbericht auf http://bugs.php.net
    • Wenn Sie eine segfault haben, versuchen , eine schaffen Backtrace
    • Fügen Sie so viele Konfigurationsinformationen ein, wie angemessen erscheint, insbesondere wenn Sie die Optimierungsstufe für Opcache-Include verwenden.
    • Überprüfen Sie den Fehlerbericht weiterhin auf Aktualisierungen. Möglicherweise werden weitere Informationen angefordert.
  2. Wenn Sie Opcache geladen haben, deaktivieren Sie Optimierungen
    • Ich wähle keinen Opcache aus, es ist großartig, aber es ist bekannt, dass einige seiner Optimierungen Fehler verursachen.
    • Wenn dies nicht funktioniert, obwohl Ihr Code möglicherweise langsamer ist, versuchen Sie zuerst, den Opcache zu entladen.
    • Wenn dies das Problem ändert oder behebt, aktualisieren Sie den von Ihnen erstellten Fehlerbericht.
  3. Deaktivieren Sie alle unnötigen Erweiterungen gleichzeitig.
    • Aktivieren Sie alle Ihre Erweiterungen einzeln und testen Sie sie nach jeder Konfigurationsänderung gründlich.
    • Wenn Sie die Problemerweiterung finden, aktualisieren Sie Ihren Fehlerbericht mit weiteren Informationen.
  4. Profitieren.

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 corruptedMeldung, 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=0in 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.


Das zugrunde liegende Problem könnte also sein, welche Version von PHP Sie ausführen?
Ishmael

@Ishmael Ja, sowie Versionen aller Erweiterungen, da die Warnung von einer Erweiterung stammen kann.
Bischof

2
Diese Antwort scheint die beste für mich zu sein. Ich habe das Problem einige Male persönlich erlebt und es war immer auf eine fehlerhafte Erweiterung zurückzuführen (in meinem Fall die Enchant-Rechtschreibbibliothek). Anders als PHP selbst könnte es auch eine schlechte Umgebung sein (nicht übereinstimmende lib-Version, falsche Abhängigkeiten usw.)
Fractalizer

1
Bei weitem die beste Antwort auf diese Frage und auch auf viele andere ähnliche Fragen
Nikita 4

Diese Antwort ist in der Tat lehrreich, aber ich glaube, es ist nicht die Aufgabe eines Anwendungsentwicklers, den Serverkern zu debuggen. In der Tat ist es viel einfacher, wenn Sie eine vollständige Stapelverfolgung haben, aber wie geht es weiter? Fragen Sie, um es auf einer Pull-Anfrage zu beheben? Nicht jeder ist ein Entwickler oder in der Lage, eine Sprache auf niedrigem Niveau wie C zu verstehen. Das Gegenteil ist auch der Fall. Letztendlich glaube ich, dass es viel einfacher wäre, wenn die Entwickler überhaupt keine Speicherverwaltungsfehler machen würden. Was, wie Sie vorschlagen, bei Opcache häufig vorkommt, aber nicht überraschend bei allen Modulen, da Sie wissen, dass einige Entwickler wissen, wie man entwickelt.
job3dot5

46

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:

opcache.enable_cli=0

Nach dem Umschalten verschwand der beschädigte Fehler zend_mm_heap.


Gleiches Problem und Lösung hier! Vielen Dank!
Mauricio Sánchez

2
Riesiges Plus 1 für diesen Beitrag. Wir haben alles versucht, aber am Ende hat nur das funktioniert.
Geoffrey Brier

7
Ich bin sicher, dass Sie wissen, dass CLI eine Befehlszeilenversion von PHP ist und nichts mit PHP-Modul zu tun hat, das beispielsweise mit Apache-Webservern verwendet wird, und ich bin gespannt, wie das Deaktivieren von Opcache mit CLI geholfen hat. (Ich
gehe

@BioHazard, abgesehen von cli gibt es die allgemeine Einstellung opcache.enable = 0. Aber es hilft nicht unbedingt dem Fall
Konstantin Ivanov

Dies sollte die akzeptierte Antwort auf diese Frage sein. Das Erhöhen des output_buffering ist nicht die Antwort, da dies laut der Dokumentation in php.ini negative Nebenwirkungen auf Ihre Website oder Anwendung haben kann.
BlueCola

41

Wenn Sie unter Linux arbeiten, versuchen Sie dies in der Befehlszeile

export USE_ZEND_ALLOC=0

Das hat mich gerettet! Ich füge dies in die php-fpm-Dienstdatei ein (systemd override)
fzerorubigd

Das hat es für mich getan. Denken Sie daran, diese Zeile hinzuzufügen, /etc/apache2/envvarswenn 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.
Pedro Cordeiro

Und es funktioniert auch unter Windows:set USE_ZEND_ALLOC=0
Nabi KAZ

22

Überprüfen Sie auf unset()s. Stellen Sie sicher, dass Sie in Destruktoren nicht unset()auf die $this(oder Entsprechungen) verweisen und dass dies unset()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 comein 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.


6
Ich bekam dieses Problem mit einfachem HTML-Dom und wechselte von einem nicht gesetzten zu $ ​​simplehtmldom-> clear (), was meine Probleme löste, danke!
Alexkb

9

Für mich funktionierte keine der vorherigen Antworten, bis ich versuchte:

opcache.fast_shutdown=0

Das scheint soweit zu funktionieren.

Ich verwende PHP 5.6 mit PHP-FPM und Apache proxy_fcgi, wenn das wichtig ist ...


1
Es gibt eine Menge "Ich auch" -Antworten für alle verschiedenen Szenarien, aber dies schien meiner Konfiguration und meinem Boom am ähnlichsten zu sein - genau diese Änderung scheint mein Problem beseitigt zu haben.
lkraav

6

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.


Das hat es für mich getan - danke! Ich dachte nicht, dass der Garbage Collector den Speicher einer zyklischen Referenz freigeben würde, also habe ich es nicht überprüft.
Halb schnell

5

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.


Dieser Fehler "zend_mm_heap beschädigt" in unserer CentOS Linux-Version 7.2.1511, PHP 5.5.38. Wir können jetzt mit dem Opcode-Cache fortfahren. Tag und Nacht ohne.
Richard Ginsberg

Danke für die Erinnerung, das war genau mein Problem!
Weasler

4

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:

  • Machen Sie den Fehler jedes Mal wiederholbar (unter welchen Bedingungen?)
  • Finden Sie den gemeinsamen Faktor
  • Deaktivieren Sie selektiv alle PHP-Module, -Optionen usw. (oder deaktivieren Sie alle, wenn Sie es eilig haben, um festzustellen, ob dies hilfreich ist, und aktivieren Sie sie dann selektiv wieder, bis sie wieder kaputt gehen).
  • Wenn dies nicht hilft, deuten viele dieser Antworten darauf hin, dass es sich möglicherweise um Code handelt. Auch hier besteht der Schlüssel darin, den Fehler bei jeder Anforderung wiederholbar zu machen, damit Sie ihn eingrenzen können. Wenn Sie den Verdacht haben, dass ein Code dies tut, entfernen Sie den Code nach der Wiederholung des Fehlers erneut, bis der Fehler aufhört. Sobald es aufhört, wissen Sie, dass der letzte Code, den Sie entfernt haben, der Schuldige war.

Wenn Sie alle oben genannten Punkte nicht erfüllen, können Sie auch Folgendes ausprobieren:

  • PHP aktualisieren oder neu kompilieren. Hoffe, welcher Fehler auch immer Ihr Problem verursacht, ist behoben.
  • Verschieben Sie Ihren Code in eine andere (Test-) Umgebung. Was hat sich geändert, wenn das Problem dadurch behoben wird? php.ini Optionen? PHP-Version? etc...

Viel Glück.


3

Ich habe eine Woche lang mit diesem Thema gerungen. Das hat bei mir funktioniert, oder zumindest so, wie es scheint

In php.inimachen diese Änderungen

report_memleaks = Off  
report_zend_debug = 0  

Mein Setup ist

Linux ubuntu 2.6.32-30-generic-pae #59-Ubuntu SMP  
with PHP Version 5.3.2-1ubuntu4.7  

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!


1
Dies hat eine Weile funktioniert, aber der Fehler ist zurück. Wie höre ich damit auf?
Sam

Das gleiche funktionierte für mich auf Mac Mavericks mit MAMP PRO 2.1.1.
MutantMahesh

Diese Lösung hat das Problem nicht dauerhaft behoben. Ich bekomme diesen Fehler wieder.
MutantMahesh

7
Sicherlich schaltet dies nur die Meldung der Fehler aus, anstatt das Problem zu beheben?
Robert ging

2

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.


2

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.


2

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)


2

Ich hatte diesen Fehler mit dem Mongo 2.2-Treiber für PHP:

$collection = $db->selectCollection('post');
$collection->ensureIndex(array('someField', 'someOtherField', 'yetAnotherField')); 

^^ FUNKTIONIERT NICHT

$collection = $db->selectCollection('post');
$collection->ensureIndex(array('someField', 'someOtherField')); 
$collection->ensureIndex(array('yetAnotherField')); 

^^ FUNKTIONIERT! (?!)


Diese Antwort half mir beim Debuggen und ging den Mongo-Problempfad ein. In meinem Fall, PHP 5.6 + Mongo 1.6.9 Treiber wurde die zend_mm_heap beschädigte Nachricht , wenn Iterieren geworfen und Abfragen von Werten aus einem Array zuvor bevölkern überforeach(selectCollection()->find()) { $arr = .. }
Mihai MATEI

2

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:

<? gc_disable(); ?>

bis zum Ende der problematischen Seite, wodurch alle Fehler verschwanden.

Quelle .


2

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.

class A {} // in file a.php
class A // in file b.php
{
  public function foo() { // load a.php }
}

Und es verursacht dieses Problem in meinem Fall.

(Verwenden des Laravel-Frameworks, Ausführen von PHP Artisan DB: Seed in Real)


1

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.


1

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.


1

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.

$link = mysql_connect('localhost', 'user', 'xxxx') or die(mysql_error());
mysql_select_db("db", $link);

Apache hat keine vorherigen Fehler gemeldet.

zend_mm_heap corrupted
zend_mm_heap corrupted
zend_mm_heap corrupted
[Mon Jul 30 09:23:49 2012] [notice] child pid 8662 exit signal Segmentation fault (11)
[Mon Jul 30 09:23:50 2012] [notice] child pid 8663 exit signal Segmentation fault (11)
[Mon Jul 30 09:23:54 2012] [notice] child pid 8666 exit signal Segmentation fault (11)
[Mon Jul 30 09:23:55 2012] [notice] child pid 8670 exit signal Segmentation fault (11)

1

"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.


1

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.


0

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 ...


0

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.


0

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:

[Mi Jun 08 17:23:21 2011] [Hinweis] Child PID 5720 Exit Signal Segmentierungsfehler (11)

Ich bin auf Mac 10.6.7 und Xampp.


0

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.


0

Rahmen

assert.active = 0 

in php.ini hat mir geholfen (es hat Typzusicherungen in der php5UTF8Bibliothek deaktiviert und ist weggegangen zend_mm_heap corrupted)


0

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.


0

Da keine der anderen Antworten darauf einging, hatte ich dieses Problem in PHP 5.4, als ich versehentlich eine Endlosschleife ausführte.


0

Einige Tipps, die jemandem helfen können

Fedora 20, PHP 5.5.18

public function testRead() {
    $ri = new MediaItemReader(self::getMongoColl('Media'));

    foreach ($ri->dataReader(10) as $data) {
       // ...
    }
}

public function dataReader($numOfItems) {
    $cursor = $this->getStorage()->find()->limit($numOfItems);

    // here is the first place where "zend_mm_heap corrupted" error occurred
    // var_dump() inside foreach-loop and generator
    var_dump($cursor); 

    foreach ($cursor as $data) {
        // ...
        // and this is the second place where "zend_mm_heap corrupted" error occurred
        $data['Geo'] = [
            // try to access [0] index that is absent in ['Geo']
            'lon' => $data['Geo'][0],
            'lat' => $data['Geo'][1]
        ];
        // ...
        // Generator is used  !!!
        yield $data;
    }
}

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.


0

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!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.