2010-07-26 154 views
1

我有一臺專用的服務器,用於處理大量數據。我現在擁有它的方式,我可以打開一個像example.php?ex_pid=123這樣的進程ID的腳本,然後放手。它下載一小部分數據,對其進行處理,然後將其上傳到數據庫中,然後重新開始。將URL變量傳遞給exec()with php

理想情況下,我想直接調用example.php?ex_pid=123,而不是將變量傳遞給example.php,如exec('./example.php'.' '.EscapeShellArg($variable));,以防止它在全局範圍內運行。

我不在乎輸出,如果它可以在後臺執行,這將是輝煌的。該服務器是一個Ubuntu分佈btw。

這甚至可能嗎?如果是這樣,任何幫助和例子將更多的讚賞。

回答

0

與此相關的主要問題是?ex_pid是通常與包含文件或通過瀏覽器訪問文件相關的GET數據。如果您包含文件或從Web瀏覽器訪問文件,這將是微不足道的,但將其作爲CLI運行它,您的唯一選擇是將其作爲參數傳遞,不幸的是。你可以將它作爲ex_pid = 123傳遞,只是解析這些數據,但它仍然需要作爲參數傳遞,但這樣做可以使用parse_str()來解析它。

根據腳本的作用,可以調用lynx調用帶有附加get數據的實際頁面,並生成運行所需的api所需的散列值。不知道這是否是一種選擇,但它是另一種方式來實現它的方式。

希望有幫助!

1

你可以這樣做:

exec("./example.php '".addslashes(serialize($_GET))."'); 

然後在使用example.php做這樣的事情:

count($_GET) == 0 && $_GET = unserialize(stripslashes($_SERVER['argv'][1])) 
+1

這是一個非常糟糕的方式來做到這一點。首先,它是escapeshellarg()而不是'addslashes()'。 – Christian 2011-04-11 09:42:32

0

我有這個一個真正的問題,不能得到它的工作運行類似example.php?variable = 1的東西。

但是我可以使用exec命令獲得一個單獨的文件,最後沒有?variable = 1。

我決定做的是根據我想發送的變量動態更改模板文件的內容。這個文件被稱爲template.php,幷包含所有通常以$ _GET運行的代碼。而不是使用$ _GET,將變量的值設置在頂部。這行代碼然後被搜索並替換爲您選擇的任何值。

然後我保存了這個新文件並運行它。

在以下示例中,我需要更改SQL查詢 - 模板文件的行$ sql =「ENTER SQL CODE HERE」;.我還需要更改頂部變量的值。 template.php中的行是$ myvar = 999999;下面的代碼將template.php中的這些行更改爲新值。

//Get the base file to modify - template.php 
$contents=file_get_contents("template.php"); 
$sql="SELECT * FROM mytable WHERE foo='".$bar."'"; 

$contents=str_replace("ENTER SQL CODE HERE",$sql,$contents); 
//Another search 
$contents=str_replace("999999",$bar,$contents); 

$filename="run_standalone_code".$bar.".php"; 

//If the file doesnt't exist, create it 
if(!file_exists($filename)){ 
file_put_contents($filename, $contents); 
} 

//Now run this file 
$cmd="/usr/local/bin/php ".$filename." >/dev/null &"; 
exec($cmd); 
+2

在這麼多層面上,這是錯誤的,我甚至無法開始爭論...... – Christian 2011-04-11 09:43:25

0

我已經完全忘記了這個問題,直到@Andrew沃對它發表了評論(我收到一封電子郵件提醒)。

無論如何,這個問題源於對使用CLI時$ argv數組如何傳遞給腳本的誤解。您可以根據需要使用盡可能多的參數。我現在的做法是這樣的:

if (isset($argv)) { 
    switch ($argv[1]) { 
     case "a_distinguishing_name_goes_here": 
      $pid = $argv[2]; 
      sample_function($pid); 
      break; 
     case "another_name_goes_here": 
      do_something_else($argv[2]); 
      break; 
    } 
}