2014-07-05 173 views
0

我有一個目前正在工作的多個php腳本。我創建了一個cron作業來在給定時間執行所有腳本。但是現在客戶需要一個觸發器/事件類型,以便他可以執行這些腳本。所以我想使用exec函數。按順序執行php腳本

所以現在的問題是,這些腳本是爲了執行。例如:我有兩個腳本,即step1.php & step2.php。如何在後臺進程中按順序運行2 php腳本。

,我讀了使用exec函數的第三個參數可以返回一個結果,但它只是總是給我一個結果: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

假設你有step1.php成功輸出true

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

$第一步是現在可以從命令結果的最後一行。

[編輯:誤讀的手冊。取決於你想要的,你可能確實需要檢查輸出結果的$ 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的答案是「好」。我假設你的當前進程已經設置好了,你不能改變它(例如,你擁有的時間量,不能因爲遺留原因而重構已存在的代碼等)。

0

你不必從一個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試圖執行的細節,我正在做出假設。

0

在第一個腳本的末尾調用第二個腳本。

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

然後你只需要在cron上運行第一個腳本。

+0

嗨Johan,首先感謝您抽出時間。 :)。但如果我只包含腳本,它將不會在後臺運行。 – user2720708

+0

我的意思是這樣的:'$ result = exec(「php two_scripts.php>/dev/null&」,$ output);'所以你不需要檢查返回值。 –