2010-11-15 20 views
99

說我們通常通過

http://localhost/index.php?a=1&b=2&c=3 

訪問我們如何執行在Linux命令提示符一樣嗎?

php -e index.php 

但是如何傳遞$ _GET變量?也許像php -e index.php - a 1 --b 2 --c 3?懷疑會有效果。

謝謝!

回答

96

通常情況下,將參數傳遞給命令行腳本,您將可使用argv全局變量或getopt

// bash command: 
// php -e myscript.php hello 
echo $argv[1]; // prints hello 

// bash command: 
// php -e myscript.php -f=world 
$opts = getopt('f:'); 
echo $opts['f']; // prints world 

$ _GET指的是HTTP GET方法參數,它們在命令行中不可用,因爲它們需要填充Web服務器。

如果你真的想填充$ _GET反正,你可以這樣做:

// bash command: 
// export QUERY_STRING="var=value&arg=value" ; php -e myscript.php 
parse_str($_SERVER['QUERY_STRING'], $_GET); 
print_r($_GET); 
/* outputs: 
    Array(
     [var] => value 
     [arg] => value 
    ) 
*/ 

你也可以執行一個腳本,填充在命令行$_GET,而無需修改所述腳本:

export QUERY_STRING="var=value&arg=value" ; \ 
php -e -r 'parse_str($_SERVER["QUERY_STRING"], $_GET); include "index.php";' 

請注意,您也可以使用$_POST$_COOKIE

+0

值得注意的是,在運行PHP 5.3的Centos 6機器上,調用'php [腳本名稱]「a = 1&b = 2&c = 3」'不會填充'$ _SERVER ['QUERY_STRING']',但您可以輕鬆通過引用'$ _SERVER ['argv'] [1]'來影響同樣的事情。 – 2013-07-31 14:31:53

+3

嘗試[此答案](http://stackoverflow.com/a/11965479/648162)從命令行填充查詢字符串而不修改PHP腳本。 – qris 2014-01-27 13:53:34

+0

這不是最好的答案。看到這個頁面上的其他答案:http://stackoverflow.com/a/11965479/543738 – 2014-12-05 17:40:55

9

嘗試使用WGET

WGET 'http://localhost/index.php?a=1&b=2&c=3' 
+1

你會想把URL用單引號括起來,和查詢部分中的&是shell元字符(單個字符通配符+「在後臺運行此命令」)。 – 2010-11-15 16:26:36

+0

@馬克乙:謝謝你的提示;我已經更新了命令 – 2010-11-15 16:28:18

+6

這會起作用,但需要一個正在運行的Web服務器,並且使整個過程比需要的效率低一點。 – Brad 2010-11-15 16:41:41

9
php file_name.php var1 var2 varN 

然後設置在PHP的第一行的$ _ GET變量,雖然這不是設置$ _GET變量的期望的方式,你可以根據你與該變量以後做什麼遇到問題。

if (isset($argv[1])) { 
    $_GET['variable_name'] = $argv[1]; 
} 

您啓動腳本的變量將可以從您的PHP應用程序中的$ argv數組訪問。第一項將會是它們來自的腳本的名稱,所以如果你想處理一堆變量,你可能想要做一個array_shift($ argv)來刪除第一個條目。或者只是加載到一個局部變量。

+0

http://php.net/manual/en/function.parse-str。php – 2013-07-31 14:26:06

+0

最簡單,最簡單的解決方案 – 2017-12-08 20:09:46

-1

我只是通過他們這樣的:

php5 script.php param1=blabla param2=yadayada 

作品就好了,$ _GET數組是:

array(3) { 
    ["script_php"]=> 
    string(0) "" 
    ["param1"]=> 
    string(6) "blabla" 
    ["param2"]=> 
    string(8) "yadayada" 
} 
+0

剛剛發現這可以在我的託管服務器上運行,但不能在我的本地服務器上運行,很怪異。 – Asaf 2012-06-06 10:19:15

+0

也許安裝版本有所不同?哪個版本適合你,哪個版本失敗了? – Kzqai 2012-06-12 19:20:47

+0

php 5.2關於託管,工程,5.3本地不...無所謂我做了$ argv的方式,以防$ _GET爲空 – Asaf 2012-06-13 12:00:09

196

從這個answer on ServerFault

使用php-cgi二進制,而不是隻php,並在命令行上傳遞參數,如下所示:

php-cgi -f index.php left=1058 right=1067 class=A language=English 

這使這$_GET

Array 
(
    [left] => 1058 
    [right] => 1067 
    [class] => A 
    [language] => English 
) 

您還可以設置將由Web服務器來設置環境變量,像這樣:

REQUEST_URI='/index.php' SCRIPT_NAME='/index.php' php-cgi -f index.php left=1058 right=1067 class=A language=English 
+15

我不知道爲什麼這沒有任何投票。簡單的解決方案! – FrenchyNZ 2012-10-01 11:07:52

+7

+1和+1:這個答案應該是被接受的答案。更少麻煩!無需更改PHP源代碼。 – micha 2013-01-07 14:34:23

+2

非常好,這可以輕鬆包裝在任何依賴於操作系統的腳本中。 – Sebastian 2013-06-12 00:43:43

14

我沒有一個PHP -cgi binary在Ubuntu上,所以我這樣做:

 
% alias php-cgi="php -r '"'parse_str(implode("&", array_slice($argv, 2)), $_GET); include($argv[1]);'"' --" 
% php-cgi test1.php foo=123 
<html> 
You set foo to 123. 
</html> 

%cat test1.php 
<html>You set foo to <?php print $_GET['foo']?>.</html> 
+0

妥協妥協,+1 – ehime 2013-12-26 22:02:30

+0

看起來像一個PHP方式來解決工作人員。 – FelikZ 2015-08-06 13:17:01

0

如果您需要傳遞$ _GET,$ _REQUEST,$ _POS T,或者其他任何你也可以使用PHP交互模式:

php -a 

然後鍵入:

<?php 
$_GET['a']=1; 
$_POST['b']=2; 
include("/somefolder/some_file_path.php"); 

這將手動設置你想要的任何變量,然後運行設置這些變量的PHP文件。

-2

或只是(如果你有LYNX):

lynx 'http://localhost/index.php?a=1&b=2&c=3' 
+3

這不會從命令行運行PHP。這將運行通過命令行調用Web服務器的瀏覽器。 – 2014-08-27 10:43:41

-1

php -r 'parse_str($argv[2],$_GET);include $argv[1];' index.php 'a=1&b=2'

你可以做的第一部分爲一個別名:

alias php-get='php -r '\''parse_str($argv[2],$_GET);include $argv[1];'\'

然後只需使用:

php-get some_script.php 'a=1&b=2&c=3'

2

- 選項1:PHP,CGI -

使用的PHP-CGI「到位 'PHP' 來運行你的腳本。這是因爲你不需要特意修改你的PHP代碼與它合作的最簡單的方法:

php-cgi -f /my/script/file.php a=1 b=2 c=3 

- 選項2:如果你有一個Web服務器 -

如果PHP文件是在命令行中,你可以使用 'wget的' web服務器上:

wget 'http://localhost/my/script/file.php?a=1&b=2&c=3' 

OR:

wget -q -O - "http://localhost/my/script/file.php?a=1&b=2&c=3" 

- 在PHP訪問變量 -

在這兩種選項1 & 2你訪問這些參數是這樣的:

$a = $_GET["a"]; 
$b = $_GET["b"]; 
$c = $_GET["c"]; 
4

有時候你沒有編輯PHP文件的選項將$ _GET設置爲傳入的參數,有時您不能或不想安裝php-cgi。

我發現這是這種情況下,最好的解決辦法:

php -r '$_GET["key"]="value"; require_once("script.php"); 

這樣就避免了改變你的PHP文件,並允許您使用純PHP命令。如果你安裝了php-cgi,盡一切辦法來使用它,但這是第二好的。認爲這個選項值得一提

-r表示在字符串後面運行php代碼。您在那裏手動設置$ _GET值,然後引用要運行的文件。

其值得一提的,你應該在正確的文件夾中運行它,往往但並不總是php文件是要求具備報表將使用您的命令的位置,以解決相對URL,文件不是位置的文件夾

+0

我想感謝你的解決方案。我認爲這應該是被接受的答案。您不必安裝額外的庫來使用它。 – swordsecurity 2016-05-28 18:27:44

1

如果你必須編輯PHP腳本的可能性,可以人爲地使用下面的代碼在腳本的開始填充$ _GET數組,然後調用的語法腳本:php -f script.php name1=value1 name2=value2

// When invoking the script via CLI like "php -f script.php name1=value1 name2=value2", this code will populate $_GET variables called "name1" and "name2", so a script designed to be called by a web server will work even when called by CLI 
if (php_sapi_name() == "cli") { 
    for ($c = 1; $c < $argc; $c++) { 
     $param = explode("=", $argv[$c], 2); 
     $_GET[$param[0]] = $param[1]; // $_GET['name1'] = 'value1' 
    } 
} 
1

在命令行粘貼以下內容

export QUERY_STRING="param1=abc&param2=xyz" ; 
POST_STRING="name=John&lastname=Doe" ; php -e -r 
'parse_str($_SERVER["QUERY_STRING"], $_GET); parse_str($_SERVER["POST_STRING"], 
$_POST); include "index.php";'