Je sais que PHP CLI est généralement utilisé en raison de l'absence de limite de temps et primaire car il n'utilise pas de threads/processus Apache.
Mais existe-t-il un moyen de définir explicitement le max_execution_time pour certains scripts pour lesquels je ne souhaite pas avoir la liberté de "temps illimité" et que je souhaite simplement garder ces scripts sous contrôle?
Si vous pensez que la réponse à cette question peut être meilleure sur superuser.com et que vous avez la permission de la déplacer, faites-le. :)
Edit : Je suis un peu sur Google et j'ai trouvé le bon paramètre:
php -d max_execution_time=5 script.php
Le documentation indique que lors de l'exécution en mode ligne de commande, la valeur par défaut est 0 (illimité). Il ne dit pas que vous ne pouvez pas le remplacer:
set_time_limit(10); // this way
ini_set('max_execution_time', 10); // or this way
Edit: Je viens de l'essayer moi-même et cela fonctionne comme prévu.
F:\dev\www>c:php -f index.php
PHP Fatal error: Maximum execution time of 2 seconds exceeded in F:\dev\www\index.php on line 3
Fatal error: Maximum execution time of 2 seconds exceeded in F:\dev\www\index.php on line 3
set_time_limit () fonctionne dans les scripts CLI.
<?php
set_time_limit(1); //in seconds
for (;;);
?>
Après une seconde, le message d'erreur suivant s'affiche:
PHP Fatal error: Maximum execution time of 1 second exceeded in \
/home/stivlo/test.php on line 4
Au départ, j'ai essayé avec sleep () et la limite de temps n'est pas appliquée. Comme @Jon l'a suggéré, utiliser un calcul réel, comme une boucle infinie, fonctionne.
J'ai trouvé ce commentaire intéressant dans la page sleep () PHP:
Remarque: La fonction set_time_limit () et la directive de configuration max_execution_time affectent uniquement le temps d'exécution du script lui-même. Tout temps consacré à une activité hors de l'exécution du script, telle que les appels système utilisant system (), la fonction sleep (), les requêtes de base de données, etc., n'est pas inclus lors de la détermination du temps maximal pendant lequel le script a été exécuté fonctionnement
J'ai le même problème. Mais dans mon cas, les appels à la base de données distante prenaient beaucoup de temps et je voulais terminer le script après un certain temps. Comme indiqué dans les autres réponses, les appels externes (ou sleep()
) ne sont pas comptabilisés dans le paramètre de délai d'attente configuré.
Donc, mon approche consistait à comprendre le pid des scripts, puis à mettre en arrière-plan une commande kill -9
après un sommeil. Voici un exemple de base:
$cmd = "(sleep 10 && kill -9 ".getmypid().") > /dev/null &";
exec($cmd); //issue a command to force kill this process in 10 seconds
$i=0;
while(1){
echo $i++."\n";
sleep(1); //simulating a query
}
Notez qu'il est possible que votre script se termine bien et qu'un nouveau script différent démarre avec le même pid que cette commande kill terminerait. C'est peu probable, mais vous devriez envisager cette possibilité si vous utilisez cette approche.
Utilisez set_time_limit function.