webman本身不内置cli参数解析器,需手动解析$_server['argv']或getopt();推荐用$_server['argv'],注意索引从1开始、值为字符串、需校验cli模式及$argc>1。

Webman 本身不是 PHP 原生 CLI 工具,它是一个基于 Workerman 的高性能 Web 框架,默认不内置 CLI 参数解析器。你写的 webman 脚本如果想接收命令行参数(比如 php start.php start -d --env=prod),得靠底层 PHP 的机制,而不是框架自动帮你拆解。
直接读 $_SERVER['argv'] 是最稳的起点
Webman 的启动脚本(如 start.php)运行在 CLI 模式下,$_SERVER['argv'] 和 $argv 都可用,但推荐用 $_SERVER['argv'] —— 它在某些 SAPI 下更可靠,且不会被某些 IDE 或调试工具意外覆盖。
注意:$_SERVER['argv'][0] 永远是脚本路径(如 start.php),第一个业务参数从索引 1 开始。
- 带空格的值必须用引号包裹:
php start.php handle --message="hello world"→$_SERVER['argv'][2]是--message=hello world,不是两个独立字符串 - 所有值都是字符串,
"42"不会自动转成整型,需手动(int)或filter_var($val, FILTER_VALIDATE_INT) - 如果执行的是
php -r "require 'start.php';",$_SERVER['argv']会为空 —— 这种调用方式不传递参数,必须直接运行脚本文件
getopt() 处理标准选项时别漏掉长选项数组
getopt() 可以解析 -d、--daemon 这类标志,但它对短选项和长选项的支持是分离的:短选项靠字符串(如 'dvh'),长选项必须显式传数组(如 ['daemon', 'help', 'env:'])。
常见错误:
- 写成
getopt('d:env:', ['env:])—— 冒号位置错,env:必须在数组里,不能混进短选项字符串 - 用
getopt('', ['env:'])单独提取长选项,但忘了重置全局$argv——getopt()会修改$argv,剩余参数会被移出,后续手动解析时要小心索引偏移 -
--env=prod和--env prod行为不同:getopt()只认前者;后者会被当成两个参数,--env后面那个prod就“掉队”了
示例(安全提取 --env 和 -d):
php
$options = getopt('d', ['env:']);
$env = $options['env'] ?? 'dev';
$daemon = isset($options['d']);
子命令(如 webman user create)必须手动解析剩余 $_SERVER['argv']
getopt() 遇到第一个非选项参数就停止解析 —— 所以 php start.php user create --name=john 中,user 和 create 会直接“卡住”解析流程,--name=john 根本不会被 getopt() 看到。
正确做法是分两步:
- 先调用
getopt()提取全局开关(如--help、--verbose) - 再遍历
$_SERVER['argv'],跳过已处理的项,找到第一个不以-开头的元素,它就是子命令名 - 后续参数按需匹配:比如
user create --name=john,create是子命令,--name=john可再用parse_str(str_replace('--', '', $arg), $kv)或正则提取
别依赖第三方 CLI 库(如 Symfony Console)强行塞进 Webman 启动脚本 —— 它们通常要求重写入口逻辑,容易和 Workerman 的进程模型冲突。
CLI 模式判断和参数校验不能省
Webman 脚本可能被误从 Web 环境访问(比如 Nginx 直接代理到 PHP-FPM),此时 $_SERVER['argv'] 为空或不可靠。必须加硬性判断:
php
if (PHP_SAPI !== 'cli') {
die('This script only supports CLI mode.');
}
另外,$argc 包含脚本名,所以检查“至少一个业务参数”应写成 $argc > 1,而不是 > 0。少写这个 > 1,脚本在没传参时拿 $_SERVER['argv'][1] 就会触发 Undefined offset 警告。
真正麻烦的点不在语法,而在于:Webman 没有约定参数格式,start.php 是你自己的入口,怎么解析、怎么分发、怎么报错,全由你定 —— 框架只管 HTTP 和 WebSocket,CLI 是你额外扛的活。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











