PHP标称超全局变量共9个,其中$GLOBALS、$_GET、$_POST、$_COOKIE、$_FILES、$_SESSION、$_REQUEST这7个在任意环境(FPM/Apache/CLI)下开箱即用;$_SERVER部分键(如SCRIPT_NAME)默认可用,但HTTP_*类键依赖variables_order配置;$_ENV默认不填充,需配置variables_order并由Web服务器透传环境变量。

PHP标称的超全局变量有9个,但实际项目中能稳定、直接用的只有7个:$_GET、$_POST、$_COOKIE、$_FILES、$_SESSION、$_REQUEST、$GLOBALS。
哪些超全局变量默认就可用,哪些要额外配置
$_GET、$_POST、$_COOKIE、$_FILES、$_SESSION、$_REQUEST、$GLOBALS 这7个在任意PHP环境(FPM、Apache模块、CLI)下开箱即用,无需改配置。
- $_SERVER 部分键可靠(如 SCRIPT_NAME、REQUEST_URI),但 HTTP_* 类键(如 HTTP_USER_AGENT)是否填充取决于
variables_order配置;若值不含E,这些键就为空 - $_ENV 默认不填充——不是你漏写了
putenv(),而是 PHP-FPM 默认禁用它;需同时满足:variables_order = "EGPCS"且 Web 服务器(如 Nginx)通过fastcgi_param显式透传环境变量
$_REQUEST 不是 $_GET + $_POST + $_COOKIE 的简单合并
它的内容完全由 php.ini 中的 request_order 决定,默认值是 "GP",意味着只含 $_GET 和 $_POST,$_COOKIE 被排除在外。
- 若设为
"GPC",则 $_COOKIE['id'] 会覆盖 $_POST['id'](如果两者都存在) - 同名参数时,后出现在
request_order字符串里的来源优先级更高 - Apache 模块模式下,$_REQUEST 可能包含 $_FILES 的文件名字段(非文件内容);FPM/CLI 下通常不包含
- 涉及权限、登录态等关键逻辑时,绝不要依赖 $_REQUEST——明确用 $_POST 或 $_GET 更安全
$_SESSION 和 $_SERVER['REQUEST_URI'] 的两个典型陷阱
$_SESSION 必须在输出任何内容(包括空格、BOM、echo)前调用 session_start(),否则报 headers already sent;但更隐蔽的问题是:
立即学习“PHP免费学习笔记(深入)”;
- 页面顶部有 UTF-8 BOM 或空白行,导致
session_start()失败,但 $_SESSION 仍可读写——只是 session_id 不保存、数据不持久化 -
session_name('myapp')必须在session_start()之前调用,否则无效
$_SERVER['REQUEST_URI'] 是原始请求 URI(如 /user/profile?id=123),而 $_SERVER['PATH_INFO'] 是 Web 服务器解析路由后截出的部分(如 /profile);两者对不上不是 bug,是来源不同——前者来自 HTTP 请求行,后者依赖服务器 rewrite 规则和 php_admin_value 配置。
真正容易被忽略的是:$_ENV 和 $_SERVER 中的不可靠键,在本地开发(Apache + mod_php)里可能“看起来正常”,一上生产(Nginx + PHP-FPM)就全空——别猜,用 var_dump(array_keys($_SERVER)) 实际看一眼。



















