Answers:
通常,为了将参数传递给命令行脚本,您将使用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
。
getopt()
,这显然告诉PHP您需要参数 f
,而不是选项 f
(将指定冒号减去冒号)。所以这只是语法。
使用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
<b>Notice</b>: Undefined index: testing in <b> ... </b><br />
php-cgi -f /var/www/vhosts/example.com/public_html/index.php action=DoSomething
做工不错..
我在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文件来将$ _GET设置为传入的参数的选项,有时您无法或不想安装php-cgi。
我发现这是针对这种情况的最佳解决方案:
php -r '$_GET["key"]="value"; require_once("script.php");'
这避免了更改您的php文件,并允许您使用普通的php命令。如果您安装了php-cgi,则一定要使用它,但这是第二件事。以为这个选择值得一提
-r表示在下面的字符串中运行php代码。您可以在此处手动设置$ _GET值,然后引用要运行的文件。
值得注意的是,您应该在正确的文件夹中运行此文件,通常但并非总是在php文件所在的文件夹中运行。Requires语句将使用命令的位置来解析相对URL,而不是文件的位置
php file_name.php var1 var2 varN
然后,$_GET
在PHP的第一行中设置变量,尽管这不是设置$_GET
变量的理想方式,并且您可能会遇到问题,具体取决于以后对该变量执行的操作。
if (isset($argv[1])) {
$_GET['variable_name'] = $argv[1];
}
启动脚本所用的变量将可以从$argv
PHP应用程序中的数组中访问。第一个条目将是它们来自的脚本的名称,因此array_shift($argv)
,如果要处理一堆变量,则可能需要删除第一个条目。或者只是加载到局部变量中。
尝试使用WGET
:
WGET 'http://localhost/index.php?a=1&b=2&c=3'
$_GET
意味着正在运行的Web服务器。
-选项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 -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¶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";'
我只是这样通过它们:
php5 script.php param1=blabla param2=yadayada
工作正常,$ _GET数组是:
array(3) {
["script_php"]=>
string(0) ""
["param1"]=>
string(6) "blabla"
["param2"]=>
string(8) "yadayada"
}
或者只是(如果您有LYNX):
lynx 'http://localhost/index.php?a=1&b=2&c=3'
php [script name] "a=1&b=2&c=3"
不会填充$_SERVER['QUERY_STRING']
,但您可以通过引用轻松影响同一件事$_SERVER['argv'][1]
。