PHP在linux命令提示符下传递$ _GET

Pat*_*ick 122 php linux

假设我们通常访问

http://localhost/index.php?a=1&b=2&c=3
Run Code Online (Sandbox Code Playgroud)

我们如何在linux命令提示符下执行相同的操作?

php -e index.php
Run Code Online (Sandbox Code Playgroud)

但是传递$ _GET变量怎么样?也许像php -e index.php --a 1 --b 2 --c 3?怀疑它会起作用.

谢谢!

qri*_*ris 237

从这个关于ServerFault的答案:

使用php-cgi二进制而不仅仅是php,并在命令行上传递参数,如下所示:

php-cgi -f index.php left=1058 right=1067 class=A language=English
Run Code Online (Sandbox Code Playgroud)

这把它放在$_GET:

Array
(
    [left] => 1058
    [right] => 1067
    [class] => A
    [language] => English
)
Run Code Online (Sandbox Code Playgroud)

您还可以设置由Web服务器设置的环境变量,如下所示:

REQUEST_URI='/index.php' SCRIPT_NAME='/index.php' php-cgi -f index.php left=1058 right=1067 class=A language=English
Run Code Online (Sandbox Code Playgroud)

  • +1和+1:这个答案应该是已接受的答案.麻烦少了!无需更改php源代码. (10认同)
  • 非常好,这可以很容易地包含在任何依赖于操作系统的脚本中. (2认同)
  • +1,非常棒的解决方案,我现在正在向后移植所有CLI脚本以支持此功能;) (2认同)

net*_*der 121

通常,要将参数传递给命令行脚本,您将使用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
Run Code Online (Sandbox Code Playgroud)

$ _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
     )
*/
Run Code Online (Sandbox Code Playgroud)

您还可以执行给定脚本,$_GET从命令行填充,而无需修改所述脚本:

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

请注意,您也可以使用$_POST和执行相同的操作$_COOKIE.

  • 尝试[此答案](http://stackoverflow.com/a/11965479/648162)从命令行填充查询字符串,而不修改PHP脚本. (4认同)

小智 16

我在Ubuntu上没有php-cgi二进制文件,所以我这样做了:

% 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>


der*_*ite 12

有时您没有选择编辑php文件来将$ _GET设置为传入的参数,有时您不能或不想安装php-cgi.

我发现这是该案例的最佳解决方案:

php -r '$_GET["key"]="value"; require_once("script.php");' 
Run Code Online (Sandbox Code Playgroud)

这可以避免更改您的php文件,并允许您使用plain php命令.如果您安装了php-cgi,请务必使用它,但这是下一个最好的事情.认为这个选项值得一提

-r表示在下面的字符串中运行php代码.您在那里手动设置$ _GET值,然后引用您要运行的文件.

值得注意的是你应该在正确的文件夹中运行它,通常但不总是php文件所在的文件夹.Prosements语句将使用命令的位置来解析相对URL,而不是文件的位置


T. *_*nes 10

php file_name.php var1 var2 varN
Run Code Online (Sandbox Code Playgroud)

然后在PHP的第一行设置$ _GET变量,尽管这不是设置$ _GET变量的理想方法,并且您可能会遇到问题,具体取决于您稍后使用该变量执行的操作.

if (isset($argv[1])) {
   $_GET['variable_name'] = $argv[1];
}
Run Code Online (Sandbox Code Playgroud)

您启动脚本的变量可以从您的php应用程序中的$ argv数组访问.第一个条目是它们来自的脚本的名称,所以如果你想处理一堆变量,你可能想要做一个array_shift($ argv)来删除第一个条目.或者只是加载到局部变量.


Giu*_*uto 9

尝试使用WGET:

WGET 'http://localhost/index.php?a=1&b=2&c=3'
Run Code Online (Sandbox Code Playgroud)

  • 这将起作用,但需要一个正在运行的Web服务器,并使整个过程的效率低于所需的效率. (7认同)

Bas*_*ion 6

-选项1:php-cgi-

使用“ php-cgi”代替“ php”来运行脚本。这是最简单的方法,因为您无需专门修改php代码即可使用它:

php-cgi -f /my/script/file.php a=1 b=2 c=3
Run Code Online (Sandbox Code Playgroud)

-选项2:如果您有网络服务器-

如果php文件位于网络服务器上,则可以在命令行上使用“ wget”:

wget 'http://localhost/my/script/file.php?a=1&b=2&c=3'
Run Code Online (Sandbox Code Playgroud)

要么:

wget -q -O - "http://localhost/my/script/file.php?a=1&b=2&c=3"
Run Code Online (Sandbox Code Playgroud)

-在php中访问变量-

在选项1和2中,您都可以像下面这样访问这些参数:

$a = $_GET["a"];
$b = $_GET["b"];
$c = $_GET["c"];
Run Code Online (Sandbox Code Playgroud)