Gibt es eine Möglichkeit in PHP den fatalen Fehler zu fangen, wenn die maximale Ausführungszeit erreicht ist und dem Benutzer eine bessere Nachricht geben?Php Trapping maximale Ausführungszeit Fehler
Antwort
Versuchen Sie, eine „Fertig“ Flag nach der Ausführung einer Datei einstellen und eine Abschaltfunktion registrieren, die wird überprüft, ob dieses Flag definiert ist
Meine ursprüngliche Antwort wird nicht funktionieren, da Sie einen schwerwiegenden Fehler nicht erfassen können. Wenn Sie es dennoch lesen möchten, überprüfen Sie den Überarbeitungsverlauf.
Meine einzige Vermutung ist, dass Sie register_shutdown_function
verwenden könnten. Setzen Sie eine Variable am Anfang des Skripts, löschen Sie sie, wenn das Skript erfolgreich abgeschlossen wurde. Schreiben Sie eine Funktion, die die Variable überprüft und wirkt auf sie, wenn es noch gesetzt ist, gelten dann die Funktion mit register_shutdown_function
http://php.net/manual/en/function.register-shutdown-function.php
Nachdem ich die ersten zwei Antworten hier gelesen habe, musste ich register_shutdown_function()
selbst testen - ich dachte nicht, dass es laufen würde. Wie kann eine Benutzerfunktion ausgeführt werden, sobald kein Speicher mehr vorhanden ist oder die Ausführungszeit abgelaufen ist? Ich war überrascht zu erfahren, dass Abschaltfunktionen tun ausführen, auch in einer OOM-Situation, oder wenn die Ausführungszeit überschritten wurde. Proof of Concept:
Speichergrenze zu testen:
<?php
function asdf() { echo "omg\n"; }
register_shutdown_function('asdf');
ini_set('memory_limit', '1000');
$x = '';
while(true) {
$x .= 'lkajsdlfkjasldkfjlaskdfjasldkfj';
}
Ausgang:
PHP Fatal error: Allowed memory size of 262144 bytes exhausted (tried to allocate 169540 bytes) in /home/scratch.php on line 9
PHP Stack trace:
PHP 1. {main}() /home/scratch.php:0
Fatal error: Allowed memory size of 262144 bytes exhausted (tried to allocate 169540 bytes) in /home/scratch.php on line 9
Call Stack:
0.0002 81360 1. {main}() /home/scratch.php:0
omg
Ausführungszeit zu testen:
cat scratch.php
<?php
function asdf() { echo "omg\n"; }
register_shutdown_function('asdf');
set_time_limit(1);
while(true) {}
Ausgang:
PHP Fatal error: Maximum execution time of 1 second exceeded in /home/scratch.php on line 7
PHP Stack trace:
PHP 1. {main}() /home/scratch.php:0
Fatal error: Maximum execution time of 1 second exceeded in /home/scratch.php on line 7
Call Stack:
0.0002 80200 1. {main}() /home/scratch.php:0
omg
Beachten Sie, dass, um Ihre Nachricht zu vor PHP-Fehlerausgabe anzuzeigen, müssten Sie PHP Fehlerausgabe vollständig deaktivieren. Welches ist für eine Produktionsstätte ohnehin die beste Vorgehensweise?
Maximale Ausführungszeit erreicht! = Erlaubte Speicher erschöpft Es ist schwer zu Skript erreichen maximale Ausführungszeit mit Schleifen und Schlaffunktionen, Schlaf friert Ausführungszeit Zähler ... – shfx
My bad. Bearbeiten von Post, um das Ausführungszeitlimit statt der Speicherauslastung zu testen –
Wenn es keine Möglichkeit gibt, den Fehler von der API-Ebene abzufangen, sollte die PHP-Engine den Speicher auf der Festplatte ablegen können, wenn ein schwerwiegender Fehler auftritt, wie Windows, wenn ein "blauer Bildschirm" angezeigt wird.
schlugen Sie mich einfach - ich habe meine Antwort in diese Richtung umgeschrieben –
;) es ist cool, Ihre Antwort ist genauer – shfx
Vielen Dank! Das hat den Trick gemacht. – AdamA