如何在PHP中同步执行shell命令

时间:2011-10-01 16:04:01

标签: php shell

我需要通过cmd运行多个脚本(5个脚本),我想确保除非并且直到第一个脚本完成第二个脚本不应该启动。因此,在第一个脚本完成后,只有第二个应该是第三个脚本,依此类推。 目前我正在使用以下代码来执行此操作

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

我认为这些脚本是异步运行的,任何建议的人都可以同步运行这些脚本。

5 个答案:

答案 0 :(得分:61)

PHP exec将等待被调度程序的执行完成,然后处理下一行,除非您使用&在字符串的末尾,在后台运行程序。

答案 1 :(得分:7)

如果我说得对,那你就是从php脚本中执行php脚本。

通常情况下,php在处理下一行之前等待exec ("php phpscript1.php");的执行完成。

要避免这种情况,只需将输出重定向到/dev/null或文件,然后在后台运行。

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

答案 2 :(得分:4)

查看php.net上的exec函数语法。 您将看到exec默认情况下不会异步运行任何内容。

exec还有另外两个参数。第三个,return_var可以提供一个提示,如果脚本成功运行或任何异常被触发。您可以使用该变量来检查是否可以运行后续脚本。

测试它并让我们知道它是否适合您。

答案 3 :(得分:1)

在我看来,运行cronjobs会更好。它们将同步执行。如果任务是“即时”,您可以执行命令来添加此cronjob。有关cronjobs的更多信息: http://unixgeeks.org/security/newbie/unix/cron-1.html

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

答案 4 :(得分:0)

除非你不分叉,否则exec和system都会等待脚本执行。

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。