web-dev-qa-db-fra.com

Définir max_execution_time dans PHP CLI

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
38
Radek Simko

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
34
Jon

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

20
stivlo

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.

1
Landon

Utilisez set_time_limit function.

0
Timofey Stolbov