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