6 Stimmen

Wie prüft man, ob der Ausgang in einer Shutdown-Funktion in PHP sauber ist?

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.

7voto

powtac Punkte 39079

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!

1voto

symcbean Punkte 46489

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.

1voto

Ferdy Punkte 890

Ein Aufruf zur error_get_last() kann Ihnen sagen, ob oder welcher Fehler aufgetreten ist. Wenn die Funktion NULL ist es ein sauberes Herunterfahren.

0voto

sobstel Punkte 1372

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.com

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.

Powered by:

X