mcpField
W
webman

webman

github.com/zjkalDevelopment1251 installsUpdated 13w ago
Repository

About webman

A development skill for building applications with the webman PHP framework, emphasizing its long-lived worker process model. It covers project structure, commands, coding conventions, and lifecycle concerns for PHP developers.

Key features

  1. 01Explain resident-worker memory behavior
  2. 02Outline application and configuration layout
  3. 03Provide start, reload, and restart commands
  4. 04Set PHP controller and response conventions
  5. 05Avoid request-state leaks and memory growth

Use cases

  1. 01Create or maintain a webman application
  2. 02Choose reload versus restart after changes
  3. 03Prevent request data leaking across workers
  4. 04Diagnose lifecycle and memory management issues

Install

Copy the command and run it in a terminal.

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

After installing, type/webmanin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with 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

Details

From the project README

webman Framework Development

webman is a high-performance, long-lived in-memory PHP framework built on workerman. Unlike PHP-FPM (bootstrap per request, tear down after response), correct webman code starts from understanding the resident-process model.

Core Mental Model: Resident Memory

After startup, a worker stays in memory and handles thousands of requests. Hard rules that follow:

  1. Never exit / die: they kill the whole worker and drop every connection on that process.
  2. Static properties / globals survive across requests: data written by the previous request can "leak" into the next. Keep request-scoped data in local variables, $request attributes, or support\Context under coroutines.
  3. Singletons are shared across requests: do not store request state on singletons; array properties that only grow are memory leaks.
  4. Code changes need reload/restart (php start.php reload). In debug mode, status / connections help diagnose issues.
  5. Controllers are new per request by default (controller_reuse => false in config/app.php). If reuse is enabled, controller properties also survive across requests.

Project Layout

├── 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

Common Commands

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 vs restart: reload only reloads app code (app/ and most of config/). Changes to config/process.php or timers/connections already created in onWorkerStart are not reloaded — use restart.

Coding Conventions

  • PHP >= 8.0 (webman v2 requires 8.1+); always declare(strict_types=1).
  • Controller signatures: public function action(Request $request): Response, with support\Request.
  • Return Webman\Http\Response via helpers (response(), json(), view(), redirect(), …). Do not echo.
  • Prefer illuminate/database (Db::table() / Eloquent models extending support\Model).
  • Read config with config('app.debug'); never include config files.
  • Log with support\Log (Log::info() / Log::channel('xx')->info()), not error_log or echo.

Do / Don't Cheatsheet

Don'tDo
exit() / die() to end a requestreturn response(...) or throw
$_GET / $_POST / $_SESSION$request->get() / $request->post() / $request->session()
header() / setcookie()$response->header() / $response->cookie()
Unbounded static arraysBounded cache (LRU) or Redis
Request data on singletonsLocals / support\Context (coroutines)
Timers created per request in app codeCustom process in config/process.php
Static vars for request state under coroutinessupport\Context::set() / get()

References (read on demand)

Comments

Markdown supported