用途
本技能用于 webman 框架的开发辅助。webman 是一个基于 workerman 的高性能、常驻内存 PHP 框架。与 PHP-FPM(每次请求引导、响应后销毁)不同,编写正确的 webman 代码需要从理解常驻进程模型出发。
核心心智模型:常驻内存
启动后,worker 常驻内存并处理成千上万个请求。由此产生以下硬性规则:
- 绝不使用 exit / die:它们会杀死整个 worker,并断开该进程上的所有连接。
- 静态属性 / 全局变量会跨请求存活:上一个请求写入的数据可能“泄漏”到下一个请求。请求级数据应保存在局部变量、$request 属性,或在协程下使用 support\Context。
- 单例在请求间共享:不要在单例上存储请求状态;只增不减的数组属性会造成内存泄漏。
- 代码修改需要 reload/restart(php start.php reload)。在调试模式下,status / connections 有助于诊断问题。
- 控制器默认每次请求新建(config/app.php 中 controller_reuse => false)。若启用复用,控制器属性也会跨请求存活。
项目结构
├── app/ # 应用代码
│ ├── controller/ # 控制器(可选;可自由选择 MVC 或 DDD)
│ ├── model/ # 模型
│ ├── middleware/ # 中间件
│ └── functions.php # 自定义辅助函数
├── config/ # 所有配置
│ ├── route.php # 路由
│ ├── process.php # 进程定义(HTTP、自定义、定时器)
│ ├── middleware.php # 中间件注册
│ ├── database.php # 数据库(illuminate/database)
│ ├── redis.php # Redis
│ └── plugin/ # 插件配置
├── plugin/ # 应用插件
├── public/ # 静态资源(唯一可被 Web 访问的目录)
├── process/ # 自定义进程类
├── support/ # 框架桥接代码
└── start.php # 入口文件
常用命令
composer create-project workerman/webman # 创建项目
# Linux / macOS
php start.php start # 前台运行(调试)
php start.php start -d # 守护进程(生产)
php start.php reload # 平滑重载(更新代码,保持连接)
php start.php restart -d # 完全重启(修改 process.php、Timer 或常驻数据后必须执行)
php start.php stop
php start.php status # 进程内存、请求计数
php start.php connections # 连接信息
# Windows(不支持守护进程 / reload)
php windows.php
reload 与 restart 的区别:reload 只重载应用代码(app/ 及大部分 config/)。对 config/process.php 的修改,或在 onWorkerStart 中已创建的定时器/连接不会被重载——需使用 restart。
编码规范
- PHP >= 8.0(webman v2 要求 8.1+);始终声明 declare(strict_types=1)。
- 控制器签名:public function action(Request $request): Response,使用 support\Request。
- 通过辅助函数(response()、json()、view()、redirect() 等)返回 Webman\Http\Response。不要使用 echo。
- 优先使用 illuminate/database(Db::table() / 继承 support\Model 的 Eloquent 模型)。
- 使用 config('app.debug') 读取配置;绝不 include 配置文件。
- 使用 support\Log 记录日志(Log::info() / Log::channel('xx')->info()),不要使用 error_log 或 echo。
Do / Don't 速查表
| Don't | Do |
|---|---|
| 用 exit() / die() 结束请求 | return response(...) 或 throw |
| $_GET / $_POST / $_SESSION | $request->get() / $request->post() / $request->session() |
| header() / setcookie() | $response->header() / $response->cookie() |
| 无界静态数组 | 有界缓存(LRU)或 Redis |
| 在单例上存请求数据 | 局部变量 / support\Context(协程) |
| 在应用代码中按请求创建定时器 | 在 config/process.php 中定义自定义进程 |
| 在协程下用静态变量存请求状态 | support\Context::set() / get() |
参考文档(按需阅读)
- 路由、控制器、请求/响应 API:references/routing-controller.md
- 中间件(洋葱模型、CORS、认证):references/middleware.md
- 数据库、Redis、缓存、分页、事务:references/database-redis.md
- 自定义进程、WebSocket/TCP、定时器:references/custom-process.md
- 协程(webman v2)、Context、并发、连接池:references/coroutine.md
- 生命周期、内存泄漏与预防:references/memory-lifecycle.md
- 插件开发(库插件与应用插件):references/plugin.md
适用场景与限制
适用于基于 webman 框架的 PHP 应用开发,尤其是需要常驻内存模型、自定义进程、WebSocket/TCP、协程等能力的场景。使用时应遵循上述常驻内存规则与编码规范。关于收费、价格、平台支持范围等具体信息,资料中暂未提供。