【发布时间】:2019-09-12 13:16:59
【问题描述】:
使用这个 php 脚本,通过 nginx 下的 fastcgi 调用。不使用特定于 php 的 fastcgi 模块,只是像任何其他 unix 可执行文件一样调用它:
#!/usr/bin/php
<?php
echo "HTTP/1.1 200 OK\r\n\r\n";
echo 'Hello world'; echo "\n";
echo $_GET['a']; echo "\n";
echo $_SERVER['QUERY_STRING']; echo "\n";
echo $_SERVER['REQUEST_URI'];
echo "\n_GET\n";
while (list($var,$value) = each ($_GET)) {
echo "$var => $value <br />\n";
}
?>
该脚本在文档根目录下名为api/example。我发送此请求:
GET /api/example?a=foo HTTP/1.1
并得到这个响应:
Hello world
a=foo
/api/example?a=foo
_GET
即。 php 已按预期初始化 $_SERVER['QUERY_STRING'] 和 $_SERVER['REQUEST_URI'] - 这表明参数正在通过 nginx/fastcgi 层传递 - 但 $_GET['a'] 仍未初始化,实际上 $_GET 关联数组完全为空?为什么?
我正在运行 PHP 5.3.29。我将 php.ini 中的 request_order 调整为 ESGP(从默认的 GP)尝试解决此问题,但我认为这无关紧要——除此之外,它是一个标准配置。
【问题讨论】:
-
你的
location /配置在你的 nginx 配置中是什么样子的? -
好的,将
#!/usr/bin/php更改为#!/usr/bin/php-cgi确实解决了我的问题,但副本并没有真正解决[非常具体的] 问题或帮助理解php 在做什么。尽我所能告诉php-cgi使用不同的“SAPI”模块运行,该模块具有不同的副作用。但令人困惑的是,在命令行上模拟 cgi 环境不起作用,例如:命令行上的QUERY_STRING='a=foo' REQUEST_URI='/api/example?a=foo' php-cgi ./example会导致与上述相同的症状。