Frage

Haben Sie eine Lösung wissen aus den PHP fatalen Fehlern zu erholen: " erlaubt Speichergröße ... erschöpft "

ich eine Shutdown-Funktion, die aufgerufen wird, wenn ein schwerwiegender Fehler auftreten. Diese Funktion erstellen Sie eine Error von ihm, und meldet es.

Das Problem ist:., Wenn es nicht mehr Speicher zur Verfügung steht, ist es nicht das Fehlerprotokoll kann (I in Firebug einzuloggen, über FirePHP, mit Zend Framework)

Also, was ich damit meine „, wie sich davon erholen “, ist, wie grundlegende Fehlerprotokoll führen, und lassen Sie Zend Framework die Header senden, so dass der Fehler protokolliert wird (in Firebug in meinem Fall) wie jeder andere Fehler?

Danke

War es hilfreich?

Lösung

Dieser Fehler ist ein fataler Fehler - das bedeutet, dass Sie nicht davon erholen können. Wenn PHP es Speicher Limit erreicht hat, wird es nicht in der Lage sein, mehr Speicher zuzuweisen Ihre Ausnahme und andere Speicher zu schaffen, muss es auf seine Ausführung tragen.

Es ist eine andere Art von Fehler -. „Abfangbare fataler Fehler“, die, wie der Name schon sagt, kann in einem try / catch abgefangen werden, aber leider ist die Speichergröße Zuordnung ist nicht einer von ihnen

Andere Tipps

if((memory_get_usage() / 1024 /1024) < 70)

ich teilen Sie einfach die memory_get_usage von 1024 Quadrat es zu einem ‚normalen‘ Megabyte Wert von ‚70‘ zu vergleichen.

lief ich in den Speicher Probleme mit PHP innerhalb einer for-Schleife und schrieb diese einfache if-Anweisung mein Skript zu verhindern, dass die Einrichtung eines schwerwiegenden Fehlers ab. Außerdem hat mir das Speicherlimit ändern, nicht zulassen, dass der Server ich operiere (dies ist oft der Fall in einigen Cloud-Angeboten wie Openshift oder große Web-Hosts wie Dreamhost.) Ich keine ernsthaften Leistungseinbußen nicht wirklich bemerkt habe ( in pHP 5.3 die Griffe Funktionen können wie dies etwas anders als pHP 4.x oder 5.x ... jeder die Leistung Implikation eines Skripts Rate einen fatalen Fehler überwiegt Overhead der Funktionsaufruf geben zwingen kann. und würde auch verhindern ein Ausreißer Skript von allen verfügbaren rAM verbrauchen.

können Viele argumentieren; oh hey Ihre Software ist nicht optimiert. Ja. Du hast wahrscheinlich Recht; aber mit komplexen Datensätzen können Sie nur so viel Leistung herauszupressen, bevor Sie brauchen, um mehr Speicher an ihm zu werfen; und Jagd auf Speicherfehler in einem Ajax-Flow kann sehr frustrierend sein; vor allem, wenn Sie nicht sicher sind, wo Sie Ihre Log-Dateien sind.

Die reguläre Art und Weise anpassen Fehlerbehandlung ist durch

set_error_handler - Setzt eine benutzerdefinierte Fehlerbehandlungsfunktion

Die Dokumentation für diese Funktion Zustand ( Hervorhebung von mir ):

  

Die folgenden Fehlertypen können nicht mit einer benutzerdefinierten Funktion behandelt werden: E_ERROR , E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, und die meisten E_STRICT in der Datei auf, wo set_error_handler () aufgerufen wird.

So wird es nicht regelmäßig arbeiten, aber man kann versuchen

Ab PHP7, Fehler und Ausnahmen sind Throwables, so können Sie versuchen, / fangen sie:

sind PHP-Fehler standardmäßig auf Ihren Apache Fehlerprotokoll /path/to/apache/logs/error.log gesendet und Sie können es dort sehen.

Haben Sie eine Idee für eine nicht getestete Trick und ich würde gerne wissen, ob es geholfen hat. Ordnen Sie eine globale Variable, wenn Sie zuerst die Shutdown-Funktion registrieren und es freigeben, wenn der Code des Shutdown-Funktion zuerst ausgeführt wird. Sie können dann ausreichend Speicher haben das Exception-Objekt zu erstellen. Lassen Sie mich wissen, ob es funktioniert und Sie den Code hier veröffentlichen.

Das hat gut funktioniert für mich:

try {
    ini_set('memory_limit', (ini_get('memory_limit')+1).'M');
} catch(Exception $e) {}

Dies setzt voraus, Ihre Speichergrenze im Format 123M ist.

Ein ich denken kann, ist, dass Sie, wenn Sie Ihre speicherintensiven Betrieb manuell Abfrage memory_get_usage() auf einer regelmäßigen Basis tun (zB jede Schleifeniterationslatenzzeit) und auskippen Ihre Kopf- / Fehler, wenn es einige Failsafe-Wert übergeht, die ist unter dem Skript zu begrenzen. Es wird Ihr Skript nach unten viel langsamer, aber zumindest werden Sie etwas zurück.

Oder, und Sie können nicht in der Lage sein, dies zu tun, führen Sie die speicherintensive Sachen als CLI-basierte Skript namens aus Ihrem Web-basierten Material durch exec. Der CLI Teil kann umfallen, aber das Webpart darüber berichten werden kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top