按顺序执行php脚本


Executing a php script in order

我现在有多个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更合适??真的不知道。请帮助

谢谢大家

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

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

老(伪):

<?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试图执行的内容缺乏细节,我对此进行了假设。

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

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

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

假设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下面的回答是"更好"。我假设你当前的进程已经设置好了,你不能改变它(例如,你有很多时间,因为遗留原因不能重构现有的代码等等)。