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


125

假设我们通常通过

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之类的东西?怀疑会起作用。

谢谢!

Answers:


122

通常,为了将参数传递给命令行脚本,您将使用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


1
值得注意的是,在运行PHP 5.3的Centos 6计算机上,调用php [script name] "a=1&b=2&c=3"不会填充$_SERVER['QUERY_STRING'],但您可以通过引用轻松影响同一件事$_SERVER['argv'][1]
Eric L.

4
尝试使用此答案可在不修改PHP脚本的情况下从命令行填充查询字符串。
qris 2014年

这不是最佳答案。请参阅此页面上的其他答案:stackoverflow.com/a/11965479/543738
LS

有用的答案,尽管如果像我一样,您想知道in中的参数名称后面的那些冒号是什么getopt(),这显然告诉PHP您需要参数 f,而不是选项 f(将指定冒号减去冒号)。所以这只是语法。
Mitya

我真的很喜欢最后一个答案,我昨天才用过。它也可以变成脚本。
reinierpost

239

ServerFault的答案

使用php-cgi二进制文件而不是just 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

10
+1和+1:此答案应该是被接受的答案。麻烦少了!无需更改php源。
micha 2013年

2
太好了,可以很容易地将其包装在任何与OS相关的脚本中。
塞巴斯蒂安

2
+1,非常棒的解决方案,我目前正在向后移植我所有的CLI脚本以支持该功能;)
ehime 2013年

到目前为止,我唯一看到的缺点是终端输出是带有<br />的HTML而不是\ n。这同样适用于所有通知和错误,例如<b>Notice</b>: Undefined index: testing in <b> ... </b><br />
bafromca

+1真棒,这在普通脚本$ _GET价值对于防爆为: php-cgi -f /var/www/vhosts/example.com/public_html/index.php action=DoSomething 做工不错..
阿杰马勒·普利文

16

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

%别名php-cgi =“ php -r'”'parse_str(implode(“&”,array_slice($ argv,2)),$ _GET); include($ argv [1]);'“'-”
%php-cgi test1.php foo = 123
<html>
您将foo设置为123。
</ html>

%cat test1.php
<html>您将foo设置为<?php print $ _GET ['foo']?>。</ html>

看起来像一种修复人员的php方式。
FelikZ 2015年

14

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

我发现这是针对这种情况的最佳解决方案:

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

这避免了更改您的php文件,并允许您使用普通的php命令。如果您安装了php-cgi,则一定要使用它,但这是第二件事。以为这个选择值得一提

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

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


1
我要感谢您的解决方案。我认为这应该是公认的答案。您无需安装额外的库即可使用它。
剑的安全性'16

这比公认的答案更好。为您投票!
faraday703

简捷而简单的解决方案!
derRobert '19

很棒的答案。您只是在代码中缺少结尾引号:)
Pedro Araujo Jorge,

10
php file_name.php var1 var2 varN

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

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

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


最简单,最简单的解决方案
若昂·皮门特尔·费雷拉

9

尝试使用WGET

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

1
您希望将URL括在单引号中,例如?。查询部分中的&和是外壳程序元字符(单个字符通配符+“在后台运行此命令”)。
Marc B

7
这可以工作,但是需要运行的Web服务器,并且使整个过程的效率比需要的低一点。
Brad 2010年

可以,但是通常$_GET意味着正在运行的Web服务器。
quickshiftin

6

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

2

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

php -a

然后输入:

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

这将手动设置所需的任何变量,然后在设置了这些变量的情况下运行php文件。


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

0

我只是这样通过它们:

php5 script.php param1=blabla param2=yadayada

工作正常,$ _GET数组是:

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

刚刚发现这在我的托管服务器上有效,但在我的本地服务器上却无法正常运行。
Asaf 2012年

也许安装的版本有所不同?此版本适合您使用哪个版本,哪个版本失败?
卡扎伊2012年

在主机上运行的php 5.2,在本地运行的5.3没关系...没关系,我以$ argv的方式完成了它,以防万一$ _GET为空
2012年

-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

或者只是(如果您有LYNX):

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

3
这不会从命令行运行PHP。这将运行浏览器,该浏览器通过命令行调用Web服务器。
Andrea Lazzarotto 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.