{"id":"29029799-ceed-4ae5-97c7-7e37f12ac570","shortId":"hd2JPk","kind":"skill","title":"webman","tagline":"Webman framework development assistant. Use when the user needs to: (1) Create Webman controllers, (2) Create Webman models, (3) Configure routes, (4) Create middleware, (5) Implement services, (6) Handle validation, or any other Webman development tasks. Triggers on phrases like","description":"# Webman 开发指南\n\nWebman 高性能 PHP 框架开发助手，专注于控制器、模型、路由、中间件的快速开发。\n\n## 常用命令\n\n```bash\n# 启动服务\nphp start.php start\n\n# 调试模式启动（前台运行）\nphp start.php start -d\n\n# 守护进程模式启动\nphp start.php start -d\n\n# 停止服务\nphp start.php stop\n\n# 重启服务\nphp start.php restart\n\n# 平滑重启（不中断服务）\nphp start.php reload\n\n# 平滑停止\nphp start.php stop -g\n\n# 查看状态\nphp start.php status\n\n# 查看连接状态\nphp start.php connections\n\n# 创建控制器\nphp webman make:controller UserController\n\n# 创建模型\nphp webman make:model User\n\n# 创建中间件\nphp webman make:middleware AuthMiddleware\n\n# 数据库迁移\nphp webman migrate\n\n# 清除缓存\nphp webman cache:clear\n```\n\n## 快速示例\n\n### 控制器\n\n```php\n<?php\nnamespace app\\controller;\n\nuse support\\Request;\n\nclass UserController\n{\n    public function index(Request $request)\n    {\n        return json(['code' => 0, 'data' => []]);\n    }\n\n    public function show(Request $request, $id)\n    {\n        return json(['code' => 0, 'data' => ['id' => $id]]);\n    }\n}\n```\n\n### 服务类\n\n```php\n<?php\nnamespace app\\service;\n\nuse app\\model\\User;\n\nclass UserService\n{\n    public function create(array $data): User\n    {\n        return User::create($data);\n    }\n\n    public function update(int $id, array $data): bool\n    {\n        $user = User::find($id);\n        return $user ? $user->update($data) : false;\n    }\n\n    public function delete(int $id): bool\n    {\n        $user = User::find($id);\n        return $user ? $user->delete() : false;\n    }\n}\n```\n\n### 验证器\n\n```php\n<?php\nnamespace app\\validate;\n\nclass UserValidate\n{\n    protected $rule = [\n        'name'  => 'require|max:25',\n        'email' => 'require|email',\n    ];\n\n    protected $message = [\n        'name.require' => '名称必须',\n        'email.require' => '邮箱必须',\n        'email.email' => '邮箱格式错误',\n    ];\n}\n```\n\n## 目录结构\n\n```\napp/\n├── controller/     # 控制器\n├── model/         # 模型\n├── middleware/    # 中间件\n├── service/       # 服务层\n├── validate/      # 验证器\n└── view/          # 视图\nconfig/\n├── app.php        # 应用配置\n├── database.php   # 数据库配置\n├── route.php      # 路由配置\n└── middleware.php # 中间件配置\n```\n\n## 内存泄漏注意事项\n\nWebman 是常驻内存框架，需要注意避免内存泄漏。以下是需要避免的做法：\n\n### 避免使用无限膨胀的 static 数组\n\n```php\n// ❌ 错误示例 - 会导致内存泄漏\nclass Foo\n{\n    public static $data = [];\n    public function index(Request $request)\n    {\n        self::$data[] = time(); // 数组无限增长\n        return response('hello');\n    }\n}\n\n// ✅ 正确做法 - 使用局部变量\nclass Foo\n{\n    public function index(Request $request)\n    {\n        $data = []; // 请求结束后自动回收\n        $data[] = time();\n        return response('hello');\n    }\n}\n```\n\n### 避免单例中的无限膨胀数组\n\n```php\n// ❌ 错误示例 - 单例中的数组无限增长\nclass Cache\n{\n    protected static $instance;\n    public $data = [];\n\n    public static function instance()\n    {\n        if (!self::$instance) {\n            self::$instance = new self;\n        }\n        return self::$instance;\n    }\n\n    public function set($key, $value)\n    {\n        $this->data[$key] = $value; // key 无限增长会泄漏\n    }\n}\n\n// ✅ 正确做法 - 限制数组大小或使用 Redis\nclass Cache\n{\n    protected static $instance;\n    public $data = [];\n    private $maxSize = 1000;\n\n    public function set($key, $value)\n    {\n        if (count($this->data) >= $this->maxSize) {\n            array_shift($this->data); // 移除最旧的元素\n        }\n        $this->data[$key] = $value;\n    }\n}\n```\n\n### 避免使用 global 关键字的数组\n\n```php\n// ❌ 错误示例\nclass Index\n{\n    public function index(Request $request)\n    {\n        global $data;\n        $data[] = time(); // 全局数组无限增长\n        return response('hello');\n    }\n}\n\n// ✅ 正确做法 - 使用依赖注入或容器\nclass Index\n{\n    public function index(Request $request)\n    {\n        $data = $request->get('data', []);\n        return response('hello');\n    }\n}\n```\n\n### 内存泄漏规避建议\n\n1. **尽量不使用** `global`、`static` 关键字的数组，如果使用确保其不会无限膨胀\n2. **对于不熟悉的类**，尽量不使用单例，用 `new` 关键字初始化\n3. **如果需要单例**，检查其是否有无限膨胀的数组属性\n4. **使用 Redis/Memcached** 等外部缓存替代内存缓存\n5. **定期清理数据**，为长生命周期的数组设置大小限制\n\n> **提示**: webman 自带的 monitor 进程会监控内存使用，当内存即将达到 `memory_limit` 时会自动安全重启进程。\n\n## 官方文档参考\n\n详细文档请参考 `references/` 目录下的官方文档。\n\n\n### 路由配置\n\n```php\n<?php\n// config/route.php\nuse Webman\\Route;\n\n// 基础路由\nRoute::get('/users', [app\\controller\\UserController::class, 'index']);\nRoute::get('/users/{id}', [app\\controller\\UserController::class, 'show']);\n\n// 路由组\nRoute::group('/api', function () {\n    Route::get('/users', [app\\controller\\UserController::class, 'index']);\n    Route::post('/users', [app\\controller\\UserController::class, 'store']);\n});\n\n// 资源路由\nRoute::resource('/users', app\\controller\\UserController::class);\n```\n\n### 模型\n\n```php\n<?php\nnamespace app\\model;\n\nuse support\\Model;\n\nclass User extends Model\n{\n    protected $table = 'users';\n\n    protected $fillable = ['name', 'email'];\n\n    protected $hidden = ['password'];\n}\n```\n\n### 中间件\n\n```php\n<?php\nnamespace app\\middleware;\n\nuse Webman\\MiddlewareInterface;\nuse Webman\\Http\\Response;\nuse Webman\\Http\\Request;\n\nclass AuthMiddleware implements MiddlewareInterface\n{\n    public function process(Request $request, callable $handler): Response\n    {\n        // 验证逻辑\n        if (!$request->session()->get('user_id')) {\n            return json(['code' => 401, 'msg' => 'Unauthorized']);\n        }\n\n        return $handler($request);\n    }\n}","tags":["webman","awesome","skills","fanqingxuan","agent-skills","ai-agent","claude-code","claude-skills","codex","coding-assistant","developer-tools","qoder"],"capabilities":["skill","source-fanqingxuan","skill-webman","topic-agent-skills","topic-ai-agent","topic-claude-code","topic-claude-skills","topic-codex","topic-coding-assistant","topic-developer-tools","topic-qoder","topic-vercel-skills"],"categories":["awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/fanqingxuan/awesome-skills/webman","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add fanqingxuan/awesome-skills","source_repo":"https://github.com/fanqingxuan/awesome-skills","install_from":"skills.sh"}},"qualityScore":"0.459","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 19 github stars · SKILL.md body (5,044 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-23T07:01:12.256Z","embedding":null,"createdAt":"2026-04-18T23:06:29.099Z","updatedAt":"2026-04-23T07:01:12.256Z","lastSeenAt":"2026-04-23T07:01:12.256Z","tsv":"'/api':473 '/users':455,463,477,485,494 '0':142,153 '1':12,410 '1000':352 '2':16,416 '25':225 '3':20,422 '4':23,425 '401':561 '5':26,429 '6':29 'app':127,161,164,216,238,456,465,478,486,495,503,526 'app.php':252 'array':172,184,364 'assist':5 'authmiddlewar':112,540 'bash':53 'bool':186,202 'cach':120,309,344 'callabl':548 'class':132,167,218,271,290,308,343,378,395,459,468,481,489,498,508,539 'clear':121 'code':141,152,560 'config':251 'config/route.php':448 'configur':21 'connect':94 'control':15,99,128,239,457,466,479,487,496 'count':359 'creat':13,17,24,171,177 'd':63,68 'data':143,154,173,178,185,195,275,282,297,299,314,335,349,361,367,370,386,387,402,405 'database.php':254 'delet':199,210 'develop':4,36 'email':226,228,518 'email.email':235 'email.require':233 'extend':510 'fals':196,211 'fillabl':516 'find':189,205 'foo':272,291 'framework':3 'function':135,145,170,180,198,277,293,317,330,354,381,398,474,544 'g':86 'get':404,454,462,476,555 'global':374,385,412 'group':472 'handl':30 'handler':549,565 'hello':287,303,392,408 'hidden':520 'http':533,537 'id':149,155,156,183,190,201,206,464,557 'implement':27,541 'index':136,278,294,379,382,396,399,460,482 'instanc':312,318,321,323,328,347 'int':182,200 'json':140,151,559 'key':332,336,338,356,371 'like':41 'limit':439 'make':98,104,110 'max':224 'maxsiz':351,363 'memori':438 'messag':230 'middlewar':25,111,243,527 'middleware.php':258 'middlewareinterfac':530,542 'migrat':116 'model':19,105,165,241,504,507,511 'monitor':435 'msg':562 'name':222,517 'name.require':231 'namespac':126,160,215,502,525 'need':10 'new':324,420 'password':521 'php':46,55,60,65,70,74,79,83,88,92,96,102,108,114,118,124,125,158,159,213,214,268,305,376,446,447,500,501,523,524 'phrase':40 'post':484 'privat':350 'process':545 'protect':220,229,310,345,512,515,519 'public':134,144,169,179,197,273,276,292,313,315,329,348,353,380,397,543 'redi':342 'redis/memcached':427 'refer':443 'reload':81 'request':131,137,138,147,148,279,280,295,296,383,384,400,401,403,538,546,547,553,566 'requir':223,227 'resourc':493 'respons':286,302,391,407,534,550 'restart':76 'return':139,150,175,191,207,285,301,326,390,406,558,564 'rout':22,451,453,461,471,475,483,492 'route.php':256 'rule':221 'self':281,320,322,325,327 'servic':28,162,245 'session':554 'set':331,355 'shift':365 'show':146,469 'skill' 'skill-webman' 'source-fanqingxuan' 'start':57,62,67 'start.php':56,61,66,71,75,80,84,89,93 'static':266,274,311,316,346,413 'status':90 'stop':72,85 'store':490 'support':130,506 'tabl':513 'task':37 'time':283,300,388 'topic-agent-skills' 'topic-ai-agent' 'topic-claude-code' 'topic-claude-skills' 'topic-codex' 'topic-coding-assistant' 'topic-developer-tools' 'topic-qoder' 'topic-vercel-skills' 'trigger':38 'unauthor':563 'updat':181,194 'use':6,129,163,449,505,528,531,535 'user':9,106,166,174,176,187,188,192,193,203,204,208,209,509,514,556 'usercontrol':100,133,458,467,480,488,497 'userservic':168 'uservalid':219 'valid':31,217,247 'valu':333,337,357,372 'view':249 'webman':1,2,14,18,35,42,44,97,103,109,115,119,261,433,450,529,532,536 '不中断服务':78 '专注于控制器':48 '中间件':244,522 '中间件的快速开发':51 '中间件配置':259 '为长生命周期的数组设置大小限制':431 '以下是需要避免的做法':264 '会导致内存泄漏':270 '使用':426 '使用依赖注入或容器':394 '使用局部变量':289 '停止服务':69 '全局数组无限增长':389 '关键字初始化':421 '关键字的数组':375,414 '内存泄漏注意事项':260 '内存泄漏规避建议':409 '创建中间件':107 '创建控制器':95 '创建模型':101 '前台运行':59 '单例中的数组无限增长':307 '名称必须':232 '启动服务':54 '基础路由':452 '如果使用确保其不会无限膨胀':415 '如果需要单例':423 '守护进程模式启动':64 '官方文档参考':441 '定期清理数据':430 '对于不熟悉的类':417 '尽量不使用':411 '尽量不使用单例':418 '常用命令':52 '平滑停止':82 '平滑重启':77 '应用配置':253 '开发指南':43 '当内存即将达到':437 '快速示例':122 '控制器':123,240 '提示':432 '数据库迁移':113 '数据库配置':255 '数组':267 '数组无限增长':284 '无限增长会泄漏':339 '时会自动安全重启进程':440 '是常驻内存框架':262 '服务层':246 '服务类':157 '查看状态':87 '查看连接状态':91 '框架开发助手':47 '检查其是否有无限膨胀的数组属性':424 '模型':49,242,499 '正确做法':288,340,393 '清除缓存':117 '用':419 '目录下的官方文档':444 '目录结构':237 '移除最旧的元素':368 '等外部缓存替代内存缓存':428 '自带的':434 '视图':250 '详细文档请参考':442 '请求结束后自动回收':298 '调试模式启动':58 '资源路由':491 '路由':50 '路由组':470 '路由配置':257,445 '进程会监控内存使用':436 '避免使用':373 '避免使用无限膨胀的':265 '避免单例中的无限膨胀数组':304 '邮箱必须':234 '邮箱格式错误':236 '重启服务':73 '错误示例':269,306,377 '限制数组大小或使用':341 '需要注意避免内存泄漏':263 '验证器':212,248 '验证逻辑':551 '高性能':45","prices":[{"id":"0766dc37-becb-4fda-8f53-4b86b6c0fac2","listingId":"29029799-ceed-4ae5-97c7-7e37f12ac570","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"fanqingxuan","category":"awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T23:06:29.099Z"}],"sources":[{"listingId":"29029799-ceed-4ae5-97c7-7e37f12ac570","source":"github","sourceId":"fanqingxuan/awesome-skills/webman","sourceUrl":"https://github.com/fanqingxuan/awesome-skills/tree/main/skills/webman","isPrimary":false,"firstSeenAt":"2026-04-18T23:06:29.099Z","lastSeenAt":"2026-04-23T07:01:12.256Z"}],"details":{"listingId":"29029799-ceed-4ae5-97c7-7e37f12ac570","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"fanqingxuan","slug":"webman","github":{"repo":"fanqingxuan/awesome-skills","stars":19,"topics":["agent-skills","ai-agent","claude-code","claude-skills","codex","coding-assistant","developer-tools","qoder","vercel-skills"],"license":"mit","html_url":"https://github.com/fanqingxuan/awesome-skills","pushed_at":"2026-04-21T16:00:10Z","description":"热门skills推荐,包括编程以及非编程等各种热门实用的skill","skill_md_sha":"a97c186f5ea35a10768ba7cb67c28d1eeac1814a","skill_md_path":"skills/webman/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/fanqingxuan/awesome-skills/tree/main/skills/webman"},"layout":"multi","source":"github","category":"awesome-skills","frontmatter":{"name":"webman","description":"Webman framework development assistant. Use when the user needs to: (1) Create Webman controllers, (2) Create Webman models, (3) Configure routes, (4) Create middleware, (5) Implement services, (6) Handle validation, or any other Webman development tasks. Triggers on phrases like \"创建 Webman 控制器\", \"生成模型\", \"配置路由\", \"Webman 开发\"."},"skills_sh_url":"https://skills.sh/fanqingxuan/awesome-skills/webman"},"updatedAt":"2026-04-23T07:01:12.256Z"}}