You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 23:52:49