2012-12-31 64 views
0

我在帶有PHP 5.3的Windows Server上運行IIS。我有兩個腳本;我們稱他們爲initiator.php和worker.php。用戶調用initiator.php並在該腳本中定義一個變量;我們稱之爲$輸入。我想借此$輸入變量,並把它傳遞給worker.php像這樣:如何在並行運行的腳本之間傳遞變量

$oShell = new COM('Wscript.Shell'); 
$oShell->Run("\"C:/Program Files (x86)/PHP/v5.3/php/worker.php -a $input",0,False); 

在worker.php我有以下拿起從initiator.php通過$輸入變量。

$aCliOpts = getopt('a:'); 
$input_from_initiator = $aCliOpts['a']; 

This works great。 initiator.php的$輸入變量已成功傳遞給worker.php,它會將其拾取並且initiator.php保持突出狀態。然而,worker.php然後將它自己的$ input_from_initiator變量,通過它自己的一些快速代碼運行,並創建第三個變量$ output_from_worker。正是這個變量,我需要發起者.php閱讀一些處理它的方法。這是我掛斷的地方。

我試過將變量從worker.php傳回給initiator.php,就像它在開始時傳遞的變量一樣,並沒有工作。我也試過使用:

header('Location: initiator.php?var=value') 

使用HTTP GET參數但無濟於事。

我最後的手段是爲worker.php寫這個變量的值到磁盤,然後從磁盤讀取initiator.php。由於潛在的磁盤I/O,我討厭這樣做。速度對此腳本非常重要。

有沒有辦法讓兩個PHP進程可以在內存中相互傳遞變量?

+0

爲什麼你首先運行一個單獨的腳本?你爲什麼要用COM對象來做到這一點?你確定將'$ input'插入到字符串中是安全的嗎?在沒有涉及HTTP的情況下,HTTP頭怎麼能工作? –

+0

默認情況下,據我所知,沒有辦法做到這一點。多個php腳本作爲單獨的進程運行。您可以共享一些變量的唯一方法是使用pcntl fork,它將基本複製您當前的進程並在單獨的進程中從此運行它。但要小心文件描述符和外部服務的連接,因爲這些服務在進程之間共享,並且一旦某個進程關閉連接,就會在其他進程中出錯。 – Xnoise

+0

下nix *容易,在windows _ a db下?做一些關於php *守護進程的研究*提供了一個答案 – 2012-12-31 02:19:21

回答

0

看看file_get_contents()http://php.net/file_get_contents,你可以通過它傳遞一個URL。所以,你可以使用查詢字符串,如:

$var = file_get_contents('http://site.tld/worker.php?input='.$input); 

而且在worker.php,只是附和你的結果。

0

在Windows上運行這是一種恥辱,因爲* nix上的sys5 extension非常奇妙!

您可以隨時使用文件或數據庫等進行通信。

0

感謝您的幫助,雖然我最終做了一些與原來的問題不同的事情。我試圖運行不同的cURL請求。 curl_multi_exec()最終爲我工作很好。

相關問題