Wie kann ich testen, ob der Ausgang in einer Shutdown-Funktion in PHP sauber ist?
Mit sauberem Ausgang meine ich, dass das Skript nicht aufgrund eines Fehlers abgebrochen wurde.
Wie kann ich testen, ob der Ausgang in einer Shutdown-Funktion in PHP sauber ist?
Mit sauberem Ausgang meine ich, dass das Skript nicht aufgrund eines Fehlers abgebrochen wurde.
Es ist eine gute Frage, für den Moment habe ich nur diese Idee: Registrieren Sie eine Shutdown-Funktion wie diese:
function shutdown() {
if (defined('END_REACHED') {
echo 'Script executed with no error', PHP_EOL;
}
}
register_shutdown_function('shutdown');
Mit auto_append_file
eine zusätzliche Datei ganz am Ende jeder Skriptausführung hinzufügen, die eine Konstante setzt.
Ihr auto_append_file.php Inhalt:
define('END_REACHED', TRUE);
Falls Sie die php.ini nicht editieren wollen, können Sie dies tun error_get_last()
o $php_errormsg
in Ihrer Registerabschaltfunktion!
Es gibt viele Gründe, warum ein Skript vorzeitig abgebrochen werden kann. Es gibt keine generische Lösung. Die einzigen Fehler, die dazu führen, dass ein Skript vorzeitig beendet wird, sind schwerwiegende Fehler - und in den meisten Fällen wird eine Shutdown-Funktion nach einem schwerwiegenden Fehler nicht ausgeführt, und auch ein benutzerdefinierter Fehler-Handler wird nur nicht schwerwiegende Fehler zuverlässig erkennen. Dann gibt es noch die Möglichkeit, Signal-Handler einzurichten - aber auch diese sehen nur einen Teil der Geschichte.
Die große Frage ist natürlich, was Sie erreichen wollen. do mit diesen Informationen in der Abschaltfunktion?
Der einzige zuverlässige Weg, um festzustellen, ob Ihre Logik wie erwartet abgeschlossen wurde, besteht darin, eine Semaphore auszulösen, wenn dies geschieht, und sie in der Shutdown-Funktion zu überprüfen.
Ein Aufruf zur error_get_last()
kann Ihnen sagen, ob oder welcher Fehler aufgetreten ist. Wenn die Funktion NULL
ist es ein sauberes Herunterfahren.
Ich habe (für PHP 5.3) die Komponente ezcExecution portiert, die dies sehr gut handhabt. Siehe https://github.com/sobstel/Execution . Grundsätzlich müssen Sie der Lib mitteilen, dass der Ausgang sauber war (durch Aufruf von Execution::cleanExit()). Andernfalls bedeutet dies, dass der Ausgang nicht sauber war. So einfach ist das.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.