我有一个目前正在运行的多个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更合适?真的不知道。请帮忙
感谢很多人
答案 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上运行第一个脚本。