mcpField
W
webman

webman

github.com/zjkal开发1251 次安装13 周前更新
代码仓库

关于 webman

面向 PHP 开发者的 webman 框架开发技能,重点说明常驻 Worker 进程模型,并涵盖项目结构、命令、编码约定和生命周期注意事项。

主要功能

  1. 01说明常驻 Worker 的内存行为
  2. 02介绍应用与配置目录结构
  3. 03提供启动、重载和重启命令
  4. 04规范 PHP 控制器与响应写法
  5. 05避免请求状态泄漏和内存增长

适用场景

  1. 01创建或维护 webman 应用
  2. 02根据变更选择重载或重启
  3. 03防止请求数据在 Worker 间泄漏
  4. 04排查生命周期与内存管理问题

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/zjkal/webman-skill --skill webman

安装后在 Claude Code 中输入/webman确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

LICENSE
.gitignore
README.en.md
README.md
references/
custom-process.md
database-redis.md
coroutine.md
middleware.md
routing-controller.md
plugin.md
memory-lifecycle.md

详细介绍

webman 框架开发

webman 是一个基于 workerman 构建的高性能、长驻内存 PHP 框架。与 PHP-FPM(每个请求都要启动应用,响应后再销毁)不同,正确编写 webman 代码的前提是理解常驻进程模型。

核心心智模型:常驻内存

启动后,worker 会常驻内存并处理数千个请求。由此得出以下硬性规则:

  1. 切勿使用 exit / die:它们会杀死整个 worker,并断开该进程上的所有连接。
  2. 静态属性 / 全局变量会跨请求保留:前一个请求写入的数据可能会“泄漏”到下一个请求中。请将请求作用域的数据保存在局部变量、$request 属性中,或在协程下使用 support\Context。
  3. 单例会在请求之间共享:不要在单例中存储请求状态;只增不减的数组属性会造成内存泄漏。
  4. 代码更改需要重新加载或重启(php start.php reload)。在调试模式下,可使用 status / connections 排查问题。
  5. 默认情况下,每个请求都会创建新的控制器(config/app.php 中的 controller_reuse => false)。如果启用了复用,控制器属性也会跨请求保留。

项目布局

├── app/                  # Application code
│   ├── controller/       # Controllers (optional; MVC or DDD as you prefer)
│   ├── model/            # Models
│   ├── middleware/       # Middleware
│   └── functions.php     # Custom helpers
├── config/               # All configuration
│   ├── route.php         # Routes
│   ├── process.php       # Process definitions (HTTP, custom, timers)
│   ├── middleware.php    # Middleware registration
│   ├── database.php      # Database (illuminate/database)
│   ├── redis.php         # Redis
│   └── plugin/           # Plugin config
├── plugin/               # Application plugins
├── public/               # Static assets (only web-accessible directory)
├── process/              # Custom process classes
├── support/              # Framework bridge code
└── start.php             # Entry point

常用命令

composer create-project workerman/webman   # create project

# Linux / macOS
php start.php start        # foreground (debug)
php start.php start -d     # daemon (production)
php start.php reload       # graceful reload (code updates, keep connections)
php start.php restart -d   # full restart (required after process.php, Timer, or resident data changes)
php start.php stop
php start.php status       # process memory, request counts
php start.php connections  # connection info

# Windows (no daemon / 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,其中 Request 为 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。

注意事项速查

不要应该
使用 exit() / die() 结束请求return response(...) 或抛出异常
$_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()

参考资料(按需阅读)

评论

支持 Markdown