request_order是PHP 5.3+引入的配置项,决定$_REQUEST合并哪些超全局变量(G=GET、P=POST、C=COOKIE等)及顺序,默认"GP"仅含GET和POST、不含COOKIE,顺序还影响同名键覆盖逻辑。

request_order 是什么,为什么会影响 $_REQUEST
request_order 是 PHP 5.3+ 引入的配置项,控制 $_REQUEST 数组从哪些超全局变量中合并数据,以及合并顺序。默认值是 "GP",表示只合并 $_GET 和 $_POST,**不包含 $_COOKIE**。如果你的代码依赖 $_REQUEST['foo'] 同时能读到 cookie 值,就会出问题——不是代码写错了,而是 request_order 没配对。
顺序还影响覆盖逻辑:"CGP" 表示先取 $_COOKIE,再被 $_GET 覆盖,最后被 $_POST 覆盖;反过来 "GPC" 就是 $_GET 覆盖 $_COOKIE。
phpEnv 环境下修改 request_order 的实操路径
phpEnv 是 Windows 下的 PHP 集成环境(类似 XAMPP),其 PHP 配置由独立的 php.ini 文件管理,**不是通过 .htaccess 或 php_value 指令生效**。
- 找到 phpEnv 安装目录下的
php\php.ini(常见路径如C:\phpEnv\php\php.ini) - 搜索
request_order,通常在 “Data Handling” 或 “Variables” 区域 - 将原行
request_order = "GP"改为request_order = "CGP"(加C才含 cookie) - 保存后,**必须重启 phpEnv 的 Apache/Nginx 服务**(仅重启浏览器或刷新页面无效)
- 验证是否生效:新建
info.php,写<?php phpinfo(); ?>,搜索request_order查看值和“Loaded Configuration File”确认读的是哪个 ini
不改 php.ini 时的临时兼容方案
有些场景你无法修改 phpEnv 的全局 php.ini(比如共享主机、CI 构建环境),可手动模拟 $_REQUEST 行为:
- 用
array_merge($_COOKIE, $_GET, $_POST)替代直接读$_REQUEST,但注意键名冲突时的覆盖顺序 - 织梦(DedeCMS)等老系统常卡在这儿,它在
include/common.inc.php第 34 行有判断:if(strtoupper(ini_get('request_order')) == 'GP'),可直接改成== 'CGP'绕过报错(仅限该系统,非通用解) - 避免在函数内直接依赖
$_REQUEST,改为显式接收$_GET/$_POST参数,更可控也更利于测试
容易被忽略的连锁影响
改了 request_order 不只影响 $_REQUEST,还会牵动其他行为:
-
variables_order若不含C(如仍是"GPCS"),$_COOKIE本身可能就不被自动填充——得先确保variables_order = "EGPCS"(E=env, G=get, P=post, C=cookie, S=server) - 某些安全扫描工具会告警
request_order = "CGP"比"GP"风险略高(因多引入 cookie 数据源),这不是 bug,是权衡:你要的是兼容性还是更严的输入边界 - CLI 模式下
$_REQUEST始终为空,这个配置对其无影响——别在命令行脚本里测它
真正关键的不是“设成什么值”,而是全项目统一认知:如果用了 $_REQUEST,就必须明确知道当前环境的 request_order 是什么,以及它实际合并了哪几个来源。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











