2010-04-20 28 views

Répondre

3

Essayez le réglage d'un drapeau « Terminé » après l'exécution d'un fichier et l'enregistrement d'une fonction d'arrêt que va vérifier si ce drapeau est défini

+0

juste me battre à elle - je réécrivais ma réponse le long de ces lignes –

+0

;) c'est cool, votre réponse est plus précise – shfx

+0

Merci! Cela a fait l'affaire. – AdamA

3

Ma réponse originale ne fonctionnera pas, car vous ne pouvez pas détecter une erreur fatale. Si vous voulez quand même le lire, vérifiez l'historique des révisions. Je suppose que vous pouvez utiliser register_shutdown_function. Définissez une variable au début du script, effacez-la lorsque le script s'est terminé avec succès. Écrivez une fonction qui vérifie cette variable et agit sur elle si elle est toujours définie, puis appliquez la fonction à l'aide register_shutdown_function

http://php.net/manual/en/function.register-shutdown-function.php

9

Après avoir lu les deux premières réponses ici, j'ai dû tester moi-même register_shutdown_function() - je ne pensais pas que ça fonctionnerait. Après tout, comment une fonction utilisateur peut-elle fonctionner une fois qu'il n'y a plus de mémoire, ou que le temps d'exécution s'est écoulé? J'ai été surpris d'apprendre que les fonctions d'arrêt s'exécutent, même dans une situation de MOO, ou lorsque le temps d'exécution a été dépassé. Preuve de concept:

Pour tester la limite de mémoire:

<?php 
function asdf() { echo "omg\n"; } 
register_shutdown_function('asdf'); 

ini_set('memory_limit', '1000'); 

$x = ''; 
while(true) { 
$x .= 'lkajsdlfkjasldkfjlaskdfjasldkfj'; 
} 

Sortie:

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 

Pour tester le temps d'exécution:

cat scratch.php 
<?php 
function asdf() { echo "omg\n"; } 
register_shutdown_function('asdf'); 

set_time_limit(1); 

while(true) {} 

Sortie:

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 

Notez que, pour que votre message affiche avant la sortie d'erreur de PHP, vous devez désactiver complètement la sortie d'erreur de PHP. Quelle est la meilleure pratique pour un site de production de toute façon.

+0

Temps d'exécution maximum atteint! = Mémoire allouée épuisée Il est difficile de faire en sorte que le script atteigne le temps d'exécution maximal avec des boucles et des fonctions de veille, le sommeil gèle le compteur d'heures d'exécution ... – shfx

+0

Modification de la publication pour tester la limite de temps d'exécution au lieu de l'épuisement de la mémoire –

0

S'il n'y a aucun moyen de piéger l'erreur du niveau API, le moteur PHP devrait pouvoir vider la mémoire sur hdd lorsqu'une erreur fatale survient, comme ce que fait Windows quand vous voyez un 'écran bleu'.