Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP在Linux命令提示符中传递$\u GET_Php_Linux - Fatal编程技术网

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

PHP在Linux命令提示符中传递$\u GET,php,linux,Php,Linux,比如说我们通常通过 http://localhost/index.php?a=1&b=2&c=3 如何在Linux命令提示符下执行相同的命令 php -e index.php 但是传递$GET变量怎么样?可能类似于php-e index.php--a1--b2--c3?我怀疑这是否行得通。尝试使用WGET: WGET 'http://localhost/index.php?a=1&b=2&c=3' Array ( [left] => 1058

比如说我们通常通过

http://localhost/index.php?a=1&b=2&c=3
如何在Linux命令提示符下执行相同的命令

php -e index.php

但是传递$GET变量怎么样?可能类似于
php-e index.php--a1--b2--c3
?我怀疑这是否行得通。

尝试使用
WGET

WGET 'http://localhost/index.php?a=1&b=2&c=3'
Array
(
    [left] => 1058
    [right] => 1067
    [class] => A
    [language] => English
)

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

$\u GET
指的是HTTP GET方法参数,这些参数在命令行上不可用,因为它们需要web服务器来填充

如果确实要填充
$\u 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
     )
*/
您还可以执行给定脚本,从命令行填充
$\u GET
,而无需修改所述脚本:

export QUERY_STRING="var=value&arg=value" ; \
php -e -r 'parse_str($_SERVER["QUERY_STRING"], $_GET); include "index.php";'
请注意,您也可以使用
$\u POST
$\u COOKIE
执行相同的操作。

使用:

php file_name.php var1 var2 varN
然后在PHP中的第一行设置
$\u GET
变量,尽管这不是设置
$\u GET
变量的理想方法,并且可能会遇到问题,具体取决于您以后对该变量所做的操作

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

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

我只是这样传递它们:

if (isset($argv[1])) {
   $_GET['variable_name'] = $argv[1];
}
php5 script.php param1=blabla param2=yadayada
php-cgi -f index.php left=1058 right=1067 class=A language=English
REQUEST_URI='/index.php' SCRIPT_NAME='/index.php' php-cgi -f index.php left=1058 right=1067 class=A language=English
$a = $_GET["a"];
$b = $_GET["b"];
$c = $_GET["c"];
它很好用。$\u GET数组是:

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

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

php5 script.php param1=blabla param2=yadayada
php-cgi -f index.php left=1058 right=1067 class=A language=English
REQUEST_URI='/index.php' SCRIPT_NAME='/index.php' php-cgi -f index.php left=1058 right=1067 class=A language=English
$a = $_GET["a"];
$b = $_GET["b"];
$c = $_GET["c"];
这将把它放入
$\u GET

WGET 'http://localhost/index.php?a=1&b=2&c=3'
Array
(
    [left] => 1058
    [right] => 1067
    [class] => A
    [language] => English
)
您还可以设置将由web服务器设置的环境变量,如下所示:

php5 script.php param1=blabla param2=yadayada
php-cgi -f index.php left=1058 right=1067 class=A language=English
REQUEST_URI='/index.php' SCRIPT_NAME='/index.php' php-cgi -f index.php left=1058 right=1067 class=A language=English
$a = $_GET["a"];
$b = $_GET["b"];
$c = $_GET["c"];

我在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> %别名php cgi=“php-r''parse_str(内爆(&),数组切片($argv,2)),$\u GET);包括($argv[1]);'"' --" %php cgi test1.php foo=123 您将foo设置为123。 %cat test1.php 你把foo设置为。
如果需要传递
$\u GET
$\u REQUEST
$\u POST
,或其他任何信息,也可以使用PHP交互模式:

php -a
然后键入:

<?php
    $_GET['a'] = 1;
    $_POST['b'] = 2;
    include("/somefolder/some_file_path.php");
或(如果您有):

使用:

php-r'parse_str($argv[2],$\u GET);包括$argv[1];'index.php'a=1&b=2'

您可以将第一个零件作为别名:

alias php get='php-r'\'parse\u str($argv[2],$\u get);包括$argv[1];“\”

然后简单地使用:

php获取一些脚本。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:如果您有web服务器 如果PHP文件位于web服务器上,则可以在命令行上使用“wget”:

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

在PHP中访问变量 在选项1和2中,您可以通过以下方式访问这些参数:

php5 script.php param1=blabla param2=yadayada
php-cgi -f index.php left=1058 right=1067 class=A language=English
REQUEST_URI='/index.php' SCRIPT_NAME='/index.php' php-cgi -f index.php left=1058 right=1067 class=A language=English
$a = $_GET["a"];
$b = $_GET["b"];
$c = $_GET["c"];

有时您没有编辑PHP文件的选项来设置传入参数的
$\u GET
,有时您不能或不想安装PHP cgi

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

php -r '$_GET["key"]="value"; require_once("script.php");'
这可以避免更改PHP文件,并允许您使用普通的
PHP
命令。如果您安装了php cgi,请务必使用它,但这是次好的选择。我认为这个选择值得一提

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


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

如果可以编辑PHP脚本,您可以在脚本开头使用以下代码人工填充
$\u 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'
    }
}
//通过类似CLI的CLI调用脚本时
//“php-f script.php name1=value1 name2=value2”,
//此代码将填充$\u获取调用的变量
//“name1”和“name2”,所以脚本设计为
//被web服务器调用将更有效
//由CLI调用时
如果(php_sapi_name()=“cli”){
对于($c=1;$c<$argc;$c++){
$param=explode(“=”,$argv[$c],2);
$\u GET[$param[0]]=$param[1];//$\u 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";'

您希望将URL括在单引号中,如?和&在查询部分是shell元字符(单字符通配符+“在后台运行此命令”)。这将起作用,但需要一个正在运行的web服务器,并使整个过程比需要的效率稍低。确实如此,但通常
$\u GET
意味着一个正在运行的web服务器。
WGET
?你不是说?我刚发现这在我的主机服务器上有效,但在我的本地服务器上不行,奇怪。也许安装的版本不同?哪个版本对你有用,哪个版本失败了?PHP5.2托管,works,5.3本地不。。。不要紧,我用$argv的方式来做,以防$u GET为空+1和+1:这个答案应该是被接受的答案。麻烦少多了!无需更改php源代码。非常好,这可以轻松包装在任何依赖操作系统的脚本中。+1,非常棒的解决方案,我目前正在备份所有CLI脚本以支持此功能;)到目前为止,我看到的唯一缺点是终端输出是带有
的HTML,而不仅仅是\n。这也适用于所有通知和错误,例如,
通知:未定义索引:测试中
+1太棒了,这在普通脚本$\u中工作,例如:
php cgi-f/var/ww