如何在PHP脚本中从命令行传递参数到$_POST?

39

我知道这可能听起来有点奇怪,但我需要向$_POST数组传递一些参数,类似于Apache或其他任何Web服务器的方式。

不幸的是,在我的Ubuntu安装中,我找不到libapache2-mod-php5


参见http://superuser.com/questions/149329/how-do-i-make-a-post-request-with-curl,然后应合并。 - Naftali
这与cURL无关。相关的规范是ID 5647461,即“如何使用PHP发送POST请求?” - Peter Mortensen
3个回答

65

只需将以下代码插入到您的脚本开头即可:

/* If started from the command line, wrap parameters to $_POST and $_GET */
if (!isset($_SERVER["HTTP_HOST"])) {
  parse_str($argv[1], $_GET);
  parse_str($argv[1], $_POST);
}

这段小代码就能够胜任(你可以决定使用$_GET还是$_POST或者,如我所需,两者兼备)。

在更改脚本之后,你可以从命令行调用它并传入参数:

php yourscript.php 'arg1=x&arg2=y'

2
这个方法非常有效。我实际上正在使用Zend版本的Eclipse。按照Zend文档的说明,我创建了一个调试配置文件,并添加了PHP脚本参数。我将您的代码放在PHP脚本的顶部,然后就完成了!它将存储在$argv[]中的参数解析到_POST数组中。非常感谢! - MikeyE
对我来说(W10操作系统)并不完全适用:$_GET/$_POST数组的单引号必须替换为双引号。 - mike rodent
1
未定义的索引:REQUEST_METHOD - evandrix
https://www.sitepoint.com/community/t/passing-get-post-variables-to-php-via-command-line/5572/9 - evandrix
似乎在使用filter_input(INPUT_POST,...)时无法正常工作。 - Maksym
类似这样做非常棒 parse_str (implode('&', array_slice ($ argv,1)), $ _POST);,我在 https://www.php.net/manual/en/features.commandline.php#108883 上找到了它。 - Pykler

19

这不是很容易做到的。你可以调用php-cgi二进制文件,并将一个虚假的POST请求导入其中。但是你需要设置大量的CGI环境变量:

echo 'var1=123&var2=abc' | REQUEST_METHOD=POST  SCRIPT_FILENAME=script.php REDIRECT_STATUS=CGI CONTENT_TYPE=application/www-form-urlencoded php-cgi 

注意:这种方法不足以实现预期功能,但可以类似实现...


如果你只是修补脚本并让它从预定义的环境变量中加载 $_POST 数组,那么做起来肯定更容易。

$_POST = parse_url($_SERVER["_POST"]);

你可以这样调用它:_POST=var=123 php script.php,以便简化操作。


这有什么优势,比起直接使用cURL呢? - Naftali
1
@Neal:这个问题不是关于在URL上调用POST请求,而是直接在脚本上执行。 - mario

1
curl --data "name=ii" "param1=value1&param2=value2" http://test.com/sample.php

3
不需要 curl 命令。 - anthonygore
2
我看不出有什么理由给这个回答点踩。虽然原帖并没有要求使用curl,但是他也没有提供太具体的信息,而这个回答绝对可行。而且它肯定很简单易懂。我点了赞。 - Anthony
3
Curl必须通过Web服务器进行,他明确表示他没有使用服务器。 - Jonathan Geisler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接