Webman不是开箱即用的网校系统,而是高性能PHP HTTP框架;应将其用于业务逻辑层(课程、订单、权限),直播等重负载交由WebSocket、FFmpeg、Redis等专用服务协同处理。

Webman 本身不是“开箱即用”的网校系统,而是一个高性能 PHP HTTP 框架;直接拿它搭完整网校,等于用螺丝刀造汽车——能造,但得自己焊底盘、装发动机。真正高效的做法是:用 Webman 承载业务逻辑层(课程管理、订单、用户权限),把直播、实时互动、文件加密等重负载模块交给专用服务(如 Workerman WebSocket、FFmpeg 转码集群、Redis 缓存),再通过接口或消息队列协同。
Webman 路由与课程模块怎么组织才不乱?
别把所有课程逻辑塞进一个 CourseController。按场景拆:课程列表页走 CourseListController@index,详情页用 CourseDetailController@show,学习进度更新走 LearningProgressController@update。这样每个控制器职责单一,后续加 AI 推荐或防刷课逻辑时,只改对应类,不影响其他流程。
常见错误现象:Route::get('/course/{id}', [CourseController::class, 'show']) 硬编码所有参数,导致后期要加 tab 或 source 查询参数时,路由匹配失效或控制器里堆满条件判断。
- 用命名参数 + 中间件做前置校验:比如
/course/{course_id}/lesson/{lesson_id}配合CheckCourseAccessMiddleware检查用户是否已购课 - 避免在路由定义里写业务逻辑,例如不要用
where做权限过滤(->where('course_id', '\d+')只校验格式,不校验权限) - 课程静态资源(如封面图、课件 PDF)别走 Webman 路由返回,应配置 Nginx 直接 serve,否则每次请求都触发 PHP 生命周期,浪费 CPU
为什么 Webman 不能直接处理直播指令?
因为 Webman 启动的是 HttpServer,而直播中的“举手”“禁言”“弹题”是毫秒级双向通信,必须走 WebSocket 协议。你调用 $app->on('message', ...) 会报错 Call to undefined method Webman\App::on() —— 这个方法属于 Workerman,不属于 Webman。
Webman 2.2.0版本强化了 TCP/UDP 服务支持,优化路由组管理,并增强异步任务处理能力。结合协程与连接池技术,Webman 能轻松应对高并发场景,适用于网站、接口服务、即时通讯、物联网及游戏开发,兼具高性能、灵活扩展与稳定可靠,是多场景 PHP 服务开发的理想选择。
正确链路是:前端连 ws://your-domain.com:2346?token=xxx(Workerman 独立 WebSocket 服务),该服务启动后,在 onConnect 回调里调用 Webman 提供的 http://127.0.0.1:8787/api/v1/auth/verify 接口校验 token,成功后把用户信息写入 Redis 的 room:1001 hash 表,后续广播指令只读 Redis,不碰 Webman。
- 别在 WebSocket 服务里重复实现用户登录态(如 session 文件读取),PHP 的
$_SESSION在长连接进程里不可用 - 高并发下,每次
onMessage都去调 Webman 鉴权接口会拖垮服务,必须用短期 token + 本地内存表(Swoole\Table)或 Redis 缓存身份 - Webman 的
config/app.php里设置的max_request对 WebSocket 服务无效,那是 HttpServer 的配置
课程视频防盗链和播放控制怎么做?
Webman 不适合做视频流代理(如用 readfile() 输出 MP4),那样既吃内存又无法断点续传。应该让 Nginx 处理视频分片(HLS/DASH),Webman 只负责生成带签名的播放 URL 和校验播放权限。
例如,前端请求课程播放页时,Webman 的 VideoPlayController@generateUrl 返回类似 https://cdn.your-domain.com/video/123.m3u8?sign=abc123&expire=1718295360 的链接,Nginx 的 secure_link 模块自动校验 sign 和过期时间,失败则返回 403。
- 签名密钥不能硬编码在 Webman 配置里,应存在环境变量或 Vault 中,防止源码泄露导致盗链泛滥
- 别用 PHP 的
file_get_contents()读取大视频文件再 echo,容易超时或 OOM - 课程回放视频建议转成 HLS 格式(
.m3u8+.ts分片),比单个 MP4 更利于 CDN 缓存和移动端适配
真正卡住进度的从来不是 Webman 性能,而是模块边界没划清:把该交给 Nginx 做的事写了 PHP 脚本,把该用 Redis 缓存的用户状态反复查数据库,把该由 Workerman 处理的实时指令硬塞进 HTTP 请求里轮询——这些设计选择,比框架选型影响更大。

















