Wie bekomme ich PHP dazu, bei einem schwerwiegenden Fehler einen Stacktrace zu protokollieren?

Lesezeit: 3 Minuten

Ich habe PHP so konfiguriert, dass Fehler protokolliert werden, und auf meinem Entwicklungscomputer werden sie in den Apache-Fehlerprotokollen wie folgt angezeigt:

[Thu Mar 17 18:22:07 2011] [error] [client ::1] PHP Parse error:  syntax error, unexpected ')' in /Users/troelskn/Projects/test/bootstrap.inc.php on line 27
[Thu Mar 17 18:22:07 2011] [error] [client ::1] PHP Stack trace:
[Thu Mar 17 18:22:07 2011] [error] [client ::1] PHP   1. {main}() /Users/troelskn/Projects/test/public/index.php:0

Auf den Produktionsmaschinen (Ubuntu) folgt dem Fehler jedoch kein Stacktrace, und an die Nachricht ist ein Referrer angehängt. Z.B. es würde so aussehen:

[Thu Mar 17 18:22:07 2011] [error] [client ::1] PHP Parse error:  syntax error, unexpected ')' in /Users/troelskn/Projects/test/bootstrap.inc.php on line 27, referer: http://localhost/

Wie kann ich diese Formatierung steuern? Ich würde sehr gerne den Stacktrace in den Protokollen verfügbar haben.

  • Werfen Sie einen Blick auf dieses stackoverflow.com/questions/3224809/…

    – Elzo Valugi

    18. März 2011 um 9:34 Uhr

  • @elzo Du hast recht – der Trace kommt tatsächlich von xdebug. Kannst du das beantworten, damit ich es akzeptieren kann?

    – troelskn

    18. März 2011 um 9:45 Uhr

  • Können Sie einen Link zum Protokollieren von PHP-Stacktraces in Apache-Protokollen geben?

    – side2k

    6. Juli 2012 um 9:04 Uhr

  • @side2k Die Stacktraces stammen von xdebug. Wenn Sie diese Erweiterung installieren, erhalten Sie Traces kostenlos.

    – troelskn

    6. Juli 2012 um 10:12 Uhr

  • @troelskn Es ist bereits installiert, aber ich sehe keine “save traces to..”-ähnliche Einstellung in xdebug-Dokumenten.

    – side2k

    6. Juli 2012 um 14:22 Uhr

Benutzer-Avatar
GordonM

Nun, wie bereits erwähnt, erhalten Sie auf der Live-Maschine nicht die gleiche Formatierung, weil auf der Live-Maschine xdebug nicht installiert ist. Es gibt debug_backtrace, aber das würde keinen schwerwiegenden Fehler abfangen.

Sie könnten xdebug auf dem Live-Server installieren, aber Sie müssten sehr vorsichtig sein, es so zu konfigurieren, dass es außer der Stack-Trace-Protokollierung keine Funktionalität verfügbar macht. Die unvorsichtige Verwendung von xdebug auf einer Live-Box könnte ein Sicherheitsrisiko darstellen, da Benutzer eine Remote-Debug-Sitzung initiieren könnten oder die erweiterten Fehlermeldungen versehentlich interne Details Ihres Codes wiedergeben könnten.

Um ehrlich zu sein? Ich denke, Ihre beste Option besteht darin, zu versuchen, die Umstände nachzubilden, unter denen der vom Live-Server protokollierte Fehler auf Ihrem Testserver aufgetreten ist.

BEARBEITEN ZUM HINZUFÜGEN: Vergessen zu erwähnen, dass xDebug nicht nur ein Sicherheitsrisiko darstellt, sondern auch negative Auswirkungen auf die Leistung Ihrer Website hat. Es hängt sich auf mehrere entscheidende Arten in die Zend Engine ein, um den Programmstatus zu protokollieren und sein Verhalten zu ändern (z. B. das Überschreiben der @-Fehlerunterdrückung), und dies wird sich unvermeidlich auf die Leistung auswirken. Sie sind im Grunde viel besser dran, wenn Sie versuchen, das Problem in einer Testumgebung zu replizieren, als Debugging-Tools zu einer Live-Umgebung hinzuzufügen.

  • Zusätzlicher Kommentar: XDEBUG mit aktivierter Profilerstellung wird die Leistung zusätzlich beeinträchtigen und die Festplatte Ihres Servers unübersichtlich machen. Ich habe einen Serverabsturz mit erschöpftem Speicherplatz (es war eine VM) gesehen, weil ein unvorsichtiger Administrator das eingeschaltet hat.

    – pgr

    2. Mai 2017 um 12:15 Uhr

Benutzer-Avatar
Elzo Valugi

Sie können mit verfolgen debug_backtrace oder debug_print_backtrace obwohl ich sie nie benutzt habe. Die beste Rückverfolgbarkeit kommt von von xdebug oder Zend-Debugger. Ich stimme Gordon zu, dass Sie keinen Debugger auf einem Produktionscomputer installieren sollten.

  • Ich glaube nicht, dass das funktioniert, weil der Call-Stack nicht übergeben wird register_shutdown_function()was AFAIK die einzige Möglichkeit ist, Todesfälle zu fangen.

    – Ian Dunn

    17. Mai um 15:40 Uhr

1157940cookie-checkWie bekomme ich PHP dazu, bei einem schwerwiegenden Fehler einen Stacktrace zu protokollieren?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy