Wie vermeiden Sie den "memory ... exhausted" - Fehler bei der Verwendung von debug_backtrace() in benutzerdefinierten error-handler?
Schrieb ich eine Fehlerbehandlung für meine website, die wie folgt aussieht:
function errorHandler($number, $string, $file, $line, $context, $type = '') {
//save stuff in DB
}
Denen ich mich so:
set_error_handler('errorHandler', E_ALL);
Speichere ich alle übergebenen Variablen in eine DB, sowie einen backtrace um mir zu helfen, Debuggen das problem:
print_r(debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT), true)
Das problem ist, dass ich manchmal diese Fehlermeldung erhalten:
Allowed memory size of 134217728 bytes exhausted (tried to allocate 30084081 bytes)
Den Grund der Fehler-handler ausgeführt wurde, Wann gab es den oben genannten Fehler war, dass ich versuchte, verwenden Sie eine nicht definierte variable nach einen Amazon S3-Objekt (aus Ihrer PHP-AWS-Bibliothek). Ich gehe davon aus, da die Amazon AWS-Bibliothek ist so groß, dass der backtrace ziehen in eine Tonne von Daten, die bewirkt, dass die out-of-memory-Fehler (?).
Ich möchte ein backtrace, wenn möglich, die für das Debuggen, aber wie verhindere ich den Aufruf der debug_backtrace()
Funktion verursacht einen fatal error (in meinem error-handler, das ist irgendwie ironisch..)?
- Siehe stackoverflow.com/questions/5175969/...
- Ich hatte das schon gesehen, aber leider gibt es nicht eine Lösung präsentiert, die funktioniert.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich vermute, dass Sie einfach nur zu entfernen brauchen, die DEBUG_BACKTRACE_PROVIDE_OBJECT
Könnte es sein, dass dein code hat zirkuläre Referenzen in den Objekten, die bedeuten, dass, wenn dumping Sie es Schleifen, bis aller Speicher verbraucht wird.
Eine alternative Art, dies zu tun ist, um werfen und fangen einer Exception, und dann verwenden Sie diese, um Ihre backtrace
http://php.net/manual/en/exception.gettraceasstring.php
Benötigen oder wenn Sie die Ausführlichkeit dann versuchen print_r($e->getTrace());
http://php.net/manual/en/exception.gettrace.php
debug_backtrace()
fehlschlägt, sollte als "Antwort" gekennzeichnetIch würde empfehlen, wenn möglich, zu ersetzen
DEBUG_BACKTRACE_PROVIDE_OBJECT
mitDEBUG_BACKTRACE_IGNORE_ARGS
http://php.net/manual/en/function.debug-backtrace.php
Könnte man eine Grenze festlegen, um Ihre debug_backtrace.
PHP debug_backtrace
50
zu1
und es läuft immer noch der Speicher.Erhöhen memory limit:
ini_set()
ist aus Sicherheitsgründen deaktiviert und 2) Wenn es wirklich aufnehmen, dass viel Speicher, wenn ein Fehler aufgetreten ist, dann ein paar gleichzeitige Fehler nutzen würde, bis die gesamte server-Speicher.zunächst prüfen, ob es wirklich der Speicher ist anstrengend.
einmal hatte ich diese Fehler, die ich zurückverfolgen bis zu einer Endlosschleife.
da Ihre server nicht erlaubt, ini_set , ich schlage vor, Sie zu kopieren Sie es auf einem lokalen system und erhöht Speicher auf 1 GB und überprüfen, wenn der Speicher immer noch erschöpft ,es ist eine Endlosschleife .
Wahrscheinlich nicht die beste Antwort aber haben Sie sich überlegt mit var_dump statt print_r? var_dump geht nur von unten ein paar Verschachtelungen, so dass die Probleme mit zirkulären Referenzen, die edmondscommerce erwähnt würde nicht dazu führen, dass Speicher erschöpft werden.
var_dump
geht den ganzen Weg nach unten, es sei denn, XDebug-extension installiert ist. 😉