Как синхронно выполнять команды оболочки в PHP - PullRequest
25 голосов
/ 01 октября 2011

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

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

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

Ответы [ 5 ]

61 голосов
/ 01 октября 2011

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

7 голосов
/ 01 октября 2011

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

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

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

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

4 голосов
/ 01 октября 2011

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

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

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

1 голос
/ 01 октября 2011

На мой взгляд, было бы лучше запустить cronjobs.Они будут выполняться синхронно.Если задача «на лету», вы можете выполнить команду, чтобы добавить этот cronjob.Больше информации о cronjobs: http://unixgeeks.org/security/newbie/unix/cron-1.html

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

0 голосов
/ 23 апреля 2018

И 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, печатая следующую строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...