PHP passing $_GET in linux command prompt

匿名 (未验证) 提交于 2019-12-03 01:52:01

问题:

Say we usually access via

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

How do we execute the same in linux command prompt?

php -e index.php 

But what about passing the $_GET variables? Maybe something like php -e index.php --a 1 --b 2 --c 3? Doubt that'll work.

Thank you!

回答1:

Typically, for passing arguments to a command line script, you will use either argv global variable or 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 refers to the HTTP GET method parameters, which are unavailable in command line, since they require a web server to populate.

If you really want to populate $_GET anyway, you can do this:

// 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      ) */ 

You can also execute a given script, populate $_GET from the command line, without having to modify said script:

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

Note that you can do the same with $_POST and $_COOKIE as well.



回答2:

From this answer on ServerFault:

Use the php-cgi binary instead of just php, and pass the arguments on the command line, like this:

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

Which puts this in $_GET:

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

You can also set environment variables that would be set by the web server, like this:

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


回答3:

I don't have a php-cgi binary on Ubuntu, so I did this:

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


回答4:

Try using WGET:

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


回答5:

php file_name.php var1 var2 varN 

Then set your $_GET variables on your first line in PHP, although this is not the desired way of setting a $_GET variable and you may experience problems depending on what you do later with that variable.

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

the variables you launch the script with will be accessible from the $argv array in your php app. the first entry will the name of the script they came from, so you may want to do an array_shift($argv) to drop that first entry if you want to process a bunch of variables. Or just load into a local variable.



回答6:

Sometimes you don't have the option of editing the php file to set $_GET to the parameters passed in, and sometimes you can't or don't want to install php-cgi.

I found this to be the best solution for that case:

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

This avoids altering your php file and lets you use the plain php command. If you have php-cgi installed, by all means use that, but this is the next best thing. Thought this options was worthy of mention

the -r means run the php code in the string following. you set the $_GET value manually there, and then reference the file you want to run.

Its worth noting you should run this in the right folder, often but not always the folder the php file is in. Requires statements will use the location of your command to resolve relative urls, NOT the location of the file



回答7:

-- Option 1: php-cgi --

Use 'php-cgi' in place of 'php' to run your script. This is the simplest way as you won't need to specially modify your php code to work with it:

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

-- Option 2: if you have a web server --

If the php file is on a web server you can use 'wget' on the command line:

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" 

-- Accessing the variables in php --

In both option 1 & 2 you access these parameters like this:

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


回答8:

If you have the possibility to edit the PHP script, you can artificially populate $_GET array using the following code at the beginning of the script and then call the script with the syntax: 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 


回答9:

At the command line paste the following

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";' 


回答10:

If you need to pass $_GET, $_REQUEST, $_POST, or anything else you can also use PHP interactive mode:

php -a 

Then type:

This will manually set any variables you want and then run your php file with those variables set.



回答11:

I just pass them like this:

php5 script.php param1=blabla param2=yadayada 

works just fine, the $_GET array is:

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


回答12:

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

You could make the first part as an alias:

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

then simply use:

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



回答13:

or just (if you have LYNX):

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


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!