2012-08-23 206 views
1

我正在「分叉」php代碼,在後臺運行腳本以啓動瀏覽器應用程序而無需等待響應。如何將參數傳遞給腳本

我希望能夠傳遞一個參數到這樣的腳本。

說我有一個數組我想要訪問腳本的問題,我怎麼能通過它?

$test = array(1,2,3); 

//for windows i do the following which works well enough 
pclose(popen("start php /path/to/script.php ","r")); 

或者對於一些Linux發行版的:

exec('php -f /path/to/script.php >/dev/null 2>&1 &'); 

所以,首先是能夠通過我的數組到該腳本?如果可以使腳本可以訪問,那麼我怎樣才能訪問該腳本中傳遞的變量?

(坐在這裏感到困惑,想通過值/引用傳遞變量....)

的感謝!

回答

2

薩科布朗找到一個例子是差不多吧。但是,我認爲這將是您正在尋找的解決方案的第二部分。
正如你可能已經知道你可以從控制檯調用程序,但傳遞任何參數的程序可能會想到:

>php -f /path/to/program arg1[ arg2 ... argN] >/dev/null 2>&1 & 

所以當你傳遞一個字符串,exec()爲什麼不只是「插入」你的數組作爲參數,然後執行它

$test = array(1,2,3); 
$args = implode($test, " "); 
$prog = 'php -f /path/to/script.php ' . $args . ' >/dev/null 2>&1 &' 
exec($prog); 

這裏有一些來自Nicolas Brown提到的教程。在你script.php你可以從$argv[]

$myParam1 = $argv[1]; 
$myParam2 = $argv[2]; 

得到的參數請注意,argv中[0]是程序的名稱。這就是爲什麼在教程中他們首先做arry_shift($argv),以擺脫第一個元素(程序的名稱和路徑)。
希望它有幫助!

+1

我正要提及它的內爆,而不是爆炸!非常感謝,我現在有工作!乾杯! – activeDev

+0

是的,我只是以「秒」的眼光認識到它,對不起。 – Havelock

+0

你也知道任何數組元素,即通過shell傳遞給程序的參數,都包含一個空白/空白,它應該用'''雙引號括起來,對嗎?! – Havelock

1

使用$ argv變量

你可以從這個tutorial

+0

非常感謝教程鏈接!我害怕即時將上述答案標記爲正確,因爲這是一個非常具體的答案。無論如何,非常感謝,我upvoted你! – activeDev

1

+1給@Havelock一個徹底的答案 - 只是想發佈一些額外的實施建議。

我實際上不得不最近實現這個:)我使用的實現路徑是serialize()數組,並將其作爲命令行參數傳遞給PHP腳本。這使您可以將任意參數傳遞給腳本,而無需使用參數解析進行多少維護工作。

我認爲序列化爲json甚至可能比PHP序列化稍微友好些。如果你走這條路線,並且如果windows/linux的兼容性對你的應用程序很重要(無論是本地開發環境還是其他),那麼一定要在兩種環境中測試你的序列化有效載荷。

Windows似乎不喜歡有效載荷內的引號。

哦,爲了可調試性,請確保在您的PHP腳本中執行一些良好的日誌記錄 - 這種解決方案適用於有趣的調試會話。

+0

太棒了!謝謝你的提示。 ive向腳本添加了大量日誌記錄,並且正在查看序列化!乾杯 – activeDev