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¶m2=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