
PHP 命令行(CLI)模式不支持 URL 查询字符串语法(如 prog.php?DBF=clients),需改用 $argv 接收参数,并通过 parse_str() 解析为关联数组,从而模拟 $_GET 行为。
php 命令行(cli)模式不支持 url 查询字符串语法(如 `prog.php?dbf=clients`),需改用 `$argv` 接收参数,并通过 `parse_str()` 解析为关联数组,从而模拟 `$_get` 行为。
在 Web 环境中,我们习惯通过 $_GET['DBF'] 获取 URL 参数(如 ?DBF=clients),但在 CLI 模式下,PHP 不启动 HTTP 服务器,因此 $_GET、$_POST、$_REQUEST 等超全局变量始终为空——CLI 与 Web SAPI 是完全独立的运行环境。
正确做法是:将参数以键值对形式作为命令行参数传入,例如:
php prog.php DBF=clients php prog.php DBF=suppliers
PHP CLI 会自动将这些参数存入全局数组 $argv,其中:
- $argv[0] 是脚本路径(如 prog.php);
- $argv[1] 是第一个用户参数(如 DBF=clients);
- 后续参数依次为 $argv[2]、$argv[3]……(若存在多个)。
接着使用 parse_str() 将形如 key=value&foo=bar 的字符串解析为关联数组。该函数原为处理 application/x-www-form-urlencoded 数据而设计,恰好适用于 CLI 场景下的简单参数解析。
立即学习“PHP免费学习笔记(深入)”;
以下是一个完整、健壮的示例脚本(建议保存为 prog.php,并添加可执行权限或显式调用 php):
#!/usr/bin/env php
<?php
// 检查是否至少传入一个参数
if ($argc < 2) {
fwrite(STDERR, "Usage: php $argv[0] KEY=VALUE [...]\n");
exit(1);
}
// 解析第一个参数(支持多个键值对,如 'DBF=clients&ENV=prod')
parse_str($argv[1], $params);
// 安全访问 DBF 参数
$dbf = $params['DBF'] ?? null;
switch ($dbf) {
case 'clients':
echo "Processing client database...\n";
break;
case 'suppliers':
echo "Processing supplier database...\n";
break;
default:
fwrite(STDERR, "Error: Unsupported DBF value '$dbf'. Valid options: clients, suppliers.\n");
exit(1);
}✅ 运行示例:
php prog.php DBF=clients # 输出:Processing client database... php prog.php DBF=suppliers # 输出:Processing supplier database... php prog.php "DBF=clients&ENV=staging" # 同样可解析多个参数
⚠️ 注意事项:
- 不要尝试伪造 $_GET:直接赋值 $_GET = $params 虽技术上可行,但违背语义且易引发混淆,应避免;
- 参数需 URL 编码(如含空格、&、=):若值含特殊字符(如 DBF=my clients),应在 shell 中用引号包裹,并确保值已 urlencode()(PHP 中可用 rawurlencode() 预处理);
- 多参数建议统一格式:推荐使用单个字符串参数(如 "a=1&b=2"),而非分散多个 $argv 项,便于解析与维护;
- 生产环境建议增强校验:加入参数白名单、类型转换(如 (int)$params['limit'])、必填项检查等;
- 替代方案参考:对于复杂 CLI 应用,推荐使用成熟库如 symfony/console,它提供参数定义、选项解析、交互式输入等完整能力。
总之,CLI 下模拟 GET 参数的核心逻辑是:命令行传参 → $argv 接收 → parse_str() 解析 → 安全使用。掌握这一模式,即可高效复用 Web 逻辑于脚本任务中。



















