PHP bietet keine herkömmlichen Mittel zum Abfangen und Wiederherstellen schwerwiegender Fehler. Dies liegt daran, dass die Verarbeitung normalerweise nach einem schwerwiegenden Fehler nicht wiederhergestellt werden sollte. Ein String, der einem Ausgabepuffer entspricht (wie im ursprünglichen Beitrag der auf PHP.net beschriebenen Technik vorgeschlagen), ist definitiv nicht ratsam. Es ist einfach unzuverlässig.
Das Aufrufen der Funktion mail () innerhalb einer Fehlerbehandlungsmethode erweist sich ebenfalls als problematisch. Wenn Sie viele Fehler hätten, wäre Ihr Mailserver mit Arbeit geladen, und Sie könnten sich in einem knorrigen Posteingang befinden. Um dies zu vermeiden, können Sie einen Cron ausführen, um Fehlerprotokolle regelmäßig zu scannen und entsprechende Benachrichtigungen zu senden. Vielleicht möchten Sie sich auch mit Systemüberwachungssoftware wie Nagios befassen .
Um mit dem Bit über das Registrieren einer Abschaltfunktion zu sprechen:
Es ist wahr, dass Sie eine Abschaltfunktion registrieren können, und das ist eine gute Antwort.
Der Punkt hier ist, dass wir normalerweise nicht versuchen sollten, schwerwiegende Fehler zu beheben, insbesondere nicht, indem wir einen regulären Ausdruck für Ihren Ausgabepuffer verwenden. Ich antwortete auf die akzeptierte Antwort , die mit einem Vorschlag auf php.net verknüpft war, der inzwischen geändert oder entfernt wurde.
Dieser Vorschlag bestand darin, während der Ausnahmebehandlung einen regulären Ausdruck für den Ausgabepuffer zu verwenden und im Falle eines schwerwiegenden Fehlers (der durch den Abgleich mit dem möglicherweise erwarteten konfigurierten Fehlertext erkannt wird) eine Wiederherstellung oder eine fortgesetzte Verarbeitung durchzuführen. Das wäre keine empfohlene Vorgehensweise (ich glaube, deshalb kann ich auch den ursprünglichen Vorschlag nicht finden. Ich übersehen ihn entweder oder die PHP-Community hat ihn abgeschossen).
Es kann erwähnenswert sein, dass die neueren Versionen von PHP (um 5.1) die Abschaltfunktion früher aufzurufen scheinen, bevor der Rückruf für die Ausgabepufferung aufgerufen wird. In Version 5 und früheren Versionen war diese Reihenfolge umgekehrt (auf den Rückruf der Ausgabepufferung folgte die Funktion zum Herunterfahren). Seit ungefähr 5.0.5 (das ist viel früher als die Version 5.2.3 des Fragestellers) werden Objekte lange vor dem Aufruf einer registrierten Abschaltfunktion entladen, sodass Sie sich nicht auf Ihre In-Memory-Objekte verlassen können viel von allem.
Das Registrieren einer Abschaltfunktion ist also in Ordnung, aber die Art von Aufgaben, die von einer Abschaltfunktion ausgeführt werden sollten, sind wahrscheinlich auf eine Handvoll sanfter Abschaltvorgänge beschränkt.
Der Schlüssel zum Mitnehmen sind hier nur einige Worte der Weisheit für jeden, der über diese Frage stolpert und den Rat in der ursprünglich akzeptierten Antwort sieht. Regexen Sie Ihren Ausgabepuffer nicht neu.