2012-02-09 63 views
1

這是我如何設置我的阿帕奇虛擬主機容器內的變量現在如何在由PHP調用的shell腳本中訪問環境變量?

SetEnv MY_VAR "/opt/" 

,PHP可以完全訪問此vairable:

echo $_SERVER['MY_VAR']; 
/opt/ 

但是,如果我把一個shell腳本從我的PHP代碼

passthru('/path/to/myscript'); 

MY_VAR/path/to/myscript內爲空。

如果我不過修改這樣的通話,它的工作原理:

passthru('export MY_VAR='. $_SERVER['MY_VAR'] .'; /path/to/myscript'); 

有沒有更好的方式來所有環境變量傳遞給shell腳本?因爲我需要通過多個。

我也試過system(),exec(),反引號和shell_exec()。它們都顯示相同的行爲,如passthru()

回答

1

如果使用putenv("MY_VAR=test");,則會將環境值傳遞給調用的shell命令。 (但不要放在$_ENV

所以,你可以簡單地做這樣的事情

foreach ($_SERVER as $k=>$v) putenv("$k=$v"); 
+0

這工作:-) Thx。 – JochenJung 2012-02-09 13:43:39

0

我想這是因爲當你調用SetEnv時,你正在修改當前的shell環境。當你隨後調用passthru時,你現有的env會與任何非導出的變量一起被銷燬,並且給/ path/to/myscript一個「新鮮」的環境。

您可以在命令行上將env變量作爲參數傳遞給/ path/to/myscript -MY_VAR =/opt嗎?

1

嘗試proc_open

proc_open('/path/to/myscript', $descriptorspec, $pipes, null, $_SERVER); 

您可以傳遞一個包含環境變量的數組作爲選項。

+0

聽起來像它會工作。不過,我無法確定,我如何獲得PHP中顯示的腳本標準輸出。 – JochenJung 2012-02-09 13:49:44

1

如果您在第一頁用phpinfo(),你會看到你的環境變量(MY_VAR)不列在「環境」框中,但在「Apache環境」中(如果這是您使用的Web服務器)。

因此,似乎「getenv」不僅從環境中獲取它的值,而且從Apache環境中獲得它的值,這似乎在通過passthru啓動某些東西時不會被繼承。

在由passthru執行的腳本中,我只能看到env。在「環境」框中列出的變量,因此是一致的。

所以,你要導出到中繼腳本每個變量,你應該使用:

putenv('MY_VAR ='.apache_getenv('MY_VAR')); 

易與陣列和一個for循環做。

相關問題