2010-04-20 10 views

Antwort

3

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

+0

schlugen Sie mich einfach - ich habe meine Antwort in diese Richtung umgeschrieben –

+0

;) es ist cool, Ihre Antwort ist genauer – shfx

+0

Vielen Dank! Das hat den Trick gemacht. – AdamA

3

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

9

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?

+0

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

+0

My bad. Bearbeiten von Post, um das Ausführungszeitlimit statt der Speicherauslastung zu testen –

0

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.