it-roy-ru.com

Как выполнять команды Shell синхронно в PHP

Мне нужно запустить несколько сценариев (5 сценариев) через cmd, я хочу убедиться, что до тех пор, пока первый сценарий не завершится, второй не должен запускаться. Таким образом, после того, как первый скрипт завершится, только второй должен быть третьим и т.д. ... В настоящее время я использую следующий код, чтобы сделать это

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

Я думаю, что эти сценарии выполняются асинхронно, парни из любого предложения, чтобы эти сценарии могли выполняться синхронно.

23
Rahul

PHP exec будет ожидать завершения вызванной программы до обработки следующей строки, если вы не используете & в конце строки для запуска программы в фоновом режиме.

58
stivlo

Если я вас правильно понял, вы выполняете сценарии php из сценария php.

Обычно php ожидает завершения выполнения функции exec ("php phpscript1.php"); перед обработкой следующей строки.

Чтобы избежать этого, просто перенаправьте вывод в /dev/null или файл и запустите его в фоновом режиме.

Например: exec ("php phpscript1.php >/dev/null 2>&1 &");.

7
Dennis

Посмотрите синтаксис функции exec на php.net . Вы увидите, что exec по умолчанию не выполняет ничего асинхронно.

exec имеет два других параметра. Третий, return_var, может дать вам подсказку, если скрипт был успешно выполнен или сработало какое-либо исключение. Вы можете использовать эту переменную, чтобы проверить, можете ли вы запустить последующие сценарии. 

Проверьте это и дайте нам знать, если это работает для вас.

4
Daniel Lopes

На мой взгляд, было бы лучше запустить cronjobs. Они будут выполняться синхронно. Если задача «на лету», вы можете выполнить команду, чтобы добавить этот cronjob. Дополнительная информация о 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, и система ждут выполнения скрипта, если вы не выполните форк.

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 выполняет script1 в течение 5 секунд, затем отображает номер следующей строки и затем выполняет script2, печатая следующую строку.

0
vinit agrawal