
PHP CLI 模式下无法直接使用 $_GET 获取 URL 查询参数;需通过 $argv 接收命令行参数,并用 parse_str() 解析为关联数组,从而实现类似 Web 环境中 ?key=value 的参数处理逻辑。
php cli 模式下无法直接使用 `$_get` 获取 url 查询参数;需通过 `$argv` 接收命令行参数,并用 `parse_str()` 解析为关联数组,从而实现类似 web 环境中 `?key=value` 的参数处理逻辑。
在命令行环境中运行 PHP 脚本(如 php prog.php?DBF=clients)时,Shell 会将 ? 及其后内容视为文件名的一部分,而非 HTTP 查询字符串——因此该写法不仅无效,还可能导致“文件不存在”错误。PHP 的 CLI 模式完全不经过 Web 服务器,也就不会自动填充 $_GET、$_POST 或 $_SERVER['QUERY_STRING'] 等超全局变量。
正确做法是将参数以标准命令行形式传入,例如:
php prog.php DBF=clients php prog.php DBF=suppliers
此时,PHP 会将参数存入全局数组 $argv:
- $argv[0] → 脚本路径(如 "prog.php")
- $argv[1] → 第一个参数(如 "DBF=clients")
- 后续参数依次类推($argv[2], $argv[3]…)
接着,使用 parse_str() 函数将形如 "key=value&foo=bar" 的字符串解析为关联数组:
立即学习“PHP免费学习笔记(深入)”;
#!/usr/bin/env php
<?php
// 检查是否至少传入一个参数
if ($argc < 2) {
die("Usage: php " . basename($argv[0]) . " key=value [key2=value2...]\n");
}
// 解析第一个参数(支持多个键值对,如 "DBF=clients&ENV=prod")
parse_str($argv[1], $params);
// 安全访问:检查键是否存在且非空
if (isset($params['DBF']) && trim($params['DBF']) !== '') {
$dbfValue = trim($params['DBF']);
switch ($dbfValue) {
case 'clients':
echo "Processing client database...\n";
break;
case 'suppliers':
echo "Processing supplier database...\n";
break;
default:
echo "Unknown DBF value: " . htmlspecialchars($dbfValue) . "\n";
exit(1);
}
} else {
echo "Error: Missing or empty 'DBF' parameter.\n";
exit(1);
}✅ 关键注意事项:
- 不要尝试在 CLI 中依赖 $_GET —— 它始终为空,除非你手动模拟(不推荐);
- 若需支持多个参数(如 DBF=clients&ENV=staging&VERBOSE=1),parse_str() 可原生解析 & 分隔的键值对;
- 始终校验 $argc 防止未传参导致 undefined index 错误;
- 对用户输入(尤其是用于文件操作或数据库标识符的参数)务必进行 trim() 和白名单校验,避免注入风险;
- 如需更健壮的参数解析,可考虑使用 symfony/console 或 getopt() 实现选项式 CLI(如 -d clients --env prod),但对简单场景,parse_str() + $argv 已足够轻量高效。
通过这种方式,你既能保持脚本调用方式简洁(贴近 Web URL 风格),又能确保 CLI 环境下的稳定性与安全性。



















