web-dev-qa-db-fra.com

Comment exécuter des commandes Shell de manière synchrone dans PHP

J'ai besoin d'exécuter plusieurs scripts (5 scripts) via cmd, je veux m'assurer que tant que le premier script n'est pas terminé, le second ne doit pas être lancé. Ainsi, une fois que le premier script est terminé, seul le deuxième devrait être le troisième, et ainsi de suite .. Actuellement, j'utilise le code suivant pour le faire.

exec ("php phpscript1.php ");
exec ("php phpscript2.php ");
exec ("php phpscript3.php ");
exec ("php phpscript4.php ");
exec ("php phpscript5.php ");

Je pense que ces scripts fonctionnent de manière asynchrone, toute suggestion suggérant que ces scripts puissent être exécutés de manière synchrone.

23
Rahul

PHP exec attendra que l'exécution du programme appelé soit terminée avant de traiter la ligne suivante, à moins que vous n'utilisiez & à la fin de la chaîne pour exécuter le programme en arrière-plan.

58
stivlo

Si je vous comprends bien, vous exécutez des scripts php depuis un script php.

Normalement, php attend l'exécution de la exec ("php phpscript1.php"); avant de traiter la ligne suivante.

Pour éviter cela, redirigez simplement la sortie vers /dev/null ou un fichier et exécutez-le en arrière-plan.

Par exemple: exec ("php phpscript1.php >/dev/null 2>&1 &");.

7
Dennis

Découvrez la syntaxe exec function sur php.net . Vous verrez que exec ne lance rien par défaut de manière asynchrone.

exec a deux autres paramètres. Le troisième, return_var, peut vous indiquer si le script a été exécuté avec succès ou si une exception a été déclenchée. Vous pouvez utiliser cette variable pour vérifier si vous pouvez exécuter les scripts suivants. 

Testez-le et laissez-nous savoir si cela fonctionne pour vous.

4
Daniel Lopes

À mon avis, il serait préférable de lancer des tâches cron. Ils vont exécuter de manière synchrone. Si la tâche est "à la volée", vous pouvez exécuter la commande pour ajouter ce travail cron. Plus d'informations sur cronjobs: http://unixgeeks.org/security/newbie/unix/cron-1.html

http://service.futurequest.net/index.php?_m=knowledgebase&_a=viewarticle&kbarticleid=30

1
ChrisH

Exec et le système attendent que le script s'exécute à moins que vous n'ayez pas fork.

Check.php

<?php
    echo "here ".__LINE__."\n";
    exec ("php phpscript1.php");
    echo "here ".__LINE__."\n";
    system("php phpscript2.php");
    echo "here ".__LINE__."\n";
?>

phpscript1.php

<?php
echo "=================phpscript1.php\n";
sleep(5);
?>

phpscript2.php

 <?php
    echo "=================phpscript2.php\n";
    sleep(5);
    ?>

Check.php exécute script1 pendant 5 secondes, affiche le numéro de la ligne suivante, puis exécute le script2 en imprimant la ligne suivante.

0
vinit agrawal