PHP 在 Linux 命令提示符中传递 $_ GET

假设我们通常通过

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的东西? 我怀疑这是否有效。

112420 次浏览

尝试使用 WGET:

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

通常,为了将参数传递给命令行脚本,您将使用 argv全局变量或 选择:

// 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引用 HTTPGET 方法参数,这些参数在命令行上不可用,因为它们需要一个 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也可以这样做。

用途:

php file_name.php var1 var2 varN

然后在 PHP 的第一行中设置 $_GET变量,尽管这不是设置 $_GET变量的理想方法,而且您可能会遇到问题,这取决于以后如何处理该变量。

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

启动脚本时使用的变量可以从 PHP 应用程序中的 $argv数组访问。第一个条目将是它们来自的脚本的名称,所以如果您想处理一组变量,可能需要执行 array_shift($argv)来删除第一个条目。或者直接加载到局部变量中。

我就这样经过他们:

php5 script.php param1=blabla param2=yadayada

它工作得很好。 $_ GET 数组是:

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

来自 服务器故障答案:

使用 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

我在 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>

如果需要传递 $_GET$_REQUEST$_POST或其他任何内容,也可以使用 PHP 交互模式:

php -a

然后输入:

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

这将手动设置您想要的任何变量,然后运行设置了这些变量的 PHP 文件。

或者(如果你有 山猫) :

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

用途:

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'

备选方案1: php-cgi

使用“ php-cgi”代替“ php”运行脚本。这是最简单的方法,因为您不需要特别修改 PHP 代码来使用它:

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

选项2: 如果你有一个网络服务器

如果 PHP 文件在 Web 服务器上,你可以在命令行中使用“ wget”:

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

:

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

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

我发现这是那个案子的最佳解决方案:

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

这样可以避免更改 PHP 文件,并允许您使用普通的 php命令。如果您已经安装了 php-cgi,请务必使用它,但这是仅次于 php-cgi 的最佳选择。我觉得这个选择值得一提。

-r表示运行以下字符串中的 PHP 代码。在那里手动设置 $_ GET 值,然后引用要运行的文件。

值得注意的是,您应该在正确的文件夹中运行它,通常(但并非总是)在 PHP 文件所在的文件夹中。“需求”语句将使用您命令的位置来解析相对 URL,没有文件的位置。

如果可以编辑 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'
}
}

在命令行中,粘贴以下内容:

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