php-cgi运行info.php时$_GET变量无法获取值的问题求助
问题描述
测试脚本(info.php)
<html> <body> <?php echo "["; echo $_GET["username"]; echo "]"; echo "["; echo $_SERVER['QUERY_STRING']; echo "]"; ?> </body> </html>
现象差异
- 用
php -S localhost:9001启动内置开发服务器,请求http://localhost:9001/info.php?username=randomname,输出[randomname][username=randomname],$_GET["username"]和QUERY_STRING均正常获取。 - 直接执行
QUERY_STRING="username=HELLO" php-cgi info.php,输出[][username=HELLO],仅QUERY_STRING有效,$_GET["username"]为空;尝试设置REQUEST_URI无效果,单独设置REQUEST_METHOD=GET会触发错误页面。
原因与解决办法
核心原因
PHP-CGI单独运行时,不会自动解析QUERY_STRING填充$_GET数组——这个解析工作是由Web服务器(如Apache、Nginx,或PHP内置开发服务器)完成的。内置服务器会完整处理HTTP请求流程,包括解析查询字符串并注入到PHP超全局变量中;而直接调用php-cgi时,缺少了服务器层的前置解析步骤。
可行解决方案
要让php-cgi解析QUERY_STRING并生成$_GET,需要同时设置REDIRECT_STATUS(模拟CGI上下文)和REQUEST_METHOD=GET:
REDIRECT_STATUS=200 REQUEST_METHOD=GET QUERY_STRING="username=HELLO" php-cgi info.php
执行后会输出预期的[HELLO][username=HELLO]。
为什么单独设REQUEST_METHOD=GET会报错?
之前单独设置REQUEST_METHOD=GET出错,是因为缺少REDIRECT_STATUS变量。PHP-CGI依赖这个变量判断是否处于Web服务器的CGI运行上下文,没有它的话,即使设置了请求方法,PHP也不会启动完整的CGI请求处理逻辑,进而触发错误。
内容的提问来源于stack exchange,提问作者Maxou
相关产品推荐
相关产品推荐

