按顺序执行php脚本

时间:2014-07-05 13:45:04

标签: php exec background-process

我有一个目前正在运行的多个PHP脚本。我创建了一个cron作业来在给定时间执行所有脚本。但现在客户端需要一个触发器/事件类型,以便他可以执行这些脚本。所以我想到了使用exec函数。

所以这就是问题,这些脚本必须按顺序执行。例如:我有2个脚本,即step1.php& step2.php。如何按顺序和后台进程运行2 php脚本。

我读到使用exec函数中的第3个参数可以返回结果,但它只给我一个结果:string(0) ""

This is what I want to achieve:
$step1 =  exec("php step1.php > /dev/null &", $output, $returnVal);
if($step1 === TRUE) exec("php step2.php > /dev/null &", $output, $returnVal);

或许他们的另一个php函数比使用exec更合适?真的不知道。请帮忙

感谢很多人

3 个答案:

答案 0 :(得分:0)

假设您有step1.php在成功时输出true

$step1 =  exec("php step1.php > /dev/null &", $output, $returnVal);

$ step1现在是命令结果的最后一行。

[编辑:误读了手册。根据你的需要,你可能需要检查$ step1的输出结果,并且你得到一个空字符串,因为你没有在step1.php脚本中输出任何东西?然而,其他一切似乎都是正确的。]

您应该检查的是$returnVal返回状态。此变量通过引用传递(根据手册),因此您的代码应为:

exec("php step1.php > /dev/null &", $output, $returnVal);
if($returnVal === TRUE) exec("php step2.php > /dev/null &", $output, $returnVal);
if($returnVal === TRUE) exec("php step3.php > /dev/null &", $output, $returnVal);

你甚至可以使用while循环:

$num_steps = 4; //Arbitrary number for example
$step = 1;

while($returnVal === TRUE && $i <= $num_steps) {

    exec('php step'.$step.'.php > /dev/null &', $output, $returnVal);
    $i++;
}

[小心,我没有测试过上面的内容,可能不适合你想做的事情]

编辑:在下面,islanddave的回答是“更好”。我假设您当前的流程已设置,并且您无法更改它(例如,您拥有的时间量,由于遗留原因无法重构现有代码等)。

答案 1 :(得分:0)

您不必从php脚本运行exec()来处理其他php脚本中的代码。可能有十几种方法可以做你想要的,但我可能会使用:

将step1.php和step2.php中的代码功能化:

Old(Pseudo):

<?php
    $var = true;
    return $var;
?>

新:

<?php
    function foo() {
        $var = true;
        return $var;
    }
?>

包含这些脚本(因为代码现在已经过功能化,在调用函数之前不会执行)。因此,在调用步骤脚本的脚本中:

<?php 
    include('step1.php');
    include('step2.php');  
?>

现在使用您需要的任何逻辑调用您需要的函数:

<?php
    include('step1.php');
    include('step2.php');

    if(foo() == true) {
        bar(); //bar() is found in step2.php
    }
?>

同样,有几种方法可以实现这一点,这很大程度上取决于您的要求以及PHP步骤中的代码所做的事情。由于缺乏有关step1和step2试图执行的细节,我正在对此做出假设。

答案 2 :(得分:0)

在第一个脚本的末尾调用第二个脚本。

if (... == TRUE) {
  include('second_script.php');
}

然后你只需要在cron上运行第一个脚本。