| 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 开发". |
Webman 开发指南
Webman 高性能 PHP 框架开发助手,专注于控制器、模型、路由、中间件的快速开发。
常用命令
php start.php start
php start.php start -d
php start.php start -d
php start.php stop
php start.php restart
php start.php reload
php start.php stop -g
php start.php status
php start.php connections
php webman make:controller UserController
php webman make:model User
php webman make:middleware AuthMiddleware
php webman migrate
php webman cache:clear
快速示例
控制器
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function index(Request $request)
{
return json(['code' => 0, 'data' => []]);
}
public function show(Request $request, $id)
{
return json(['code' => 0, 'data' => ['id' => $id]]);
}
}
服务类
<?php
namespace app\service;
use app\model\User;
class UserService
{
public function create(array $data): User
{
return User::create($data);
}
public function update(int $id, array $data): bool
{
$user = User::find($id);
return $user ? $user->update($data) : false;
}
public function delete(int $id): bool
{
$user = User::find($id);
return $user ? $user->delete() : false;
}
}
验证器
<?php
namespace app\validate;
class UserValidate
{
protected $rule = [
'name' => 'require|max:25',
'email' => 'require|email',
];
protected $message = [
'name.require' => '名称必须',
'email.require' => '邮箱必须',
'email.email' => '邮箱格式错误',
];
}
目录结构
app/
├── controller/ # 控制器
├── model/ # 模型
├── middleware/ # 中间件
├── service/ # 服务层
├── validate/ # 验证器
└── view/ # 视图
config/
├── app.php # 应用配置
├── database.php # 数据库配置
├── route.php # 路由配置
└── middleware.php # 中间件配置
内存泄漏注意事项
Webman 是常驻内存框架,需要注意避免内存泄漏。以下是需要避免的做法:
避免使用无限膨胀的 static 数组
class Foo
{
public static $data = [];
public function index(Request $request)
{
self::$data[] = time();
return response('hello');
}
}
class Foo
{
public function index(Request $request)
{
$data = [];
$data[] = time();
return response('hello');
}
}
避免单例中的无限膨胀数组
class Cache
{
protected static $instance;
public $data = [];
public static function instance()
{
if (!self::$instance) {
self::$instance = new self;
}
return self::$instance;
}
public function set($key, $value)
{
$this->data[$key] = $value;
}
}
class Cache
{
protected static $instance;
public $data = [];
private $maxSize = 1000;
public function set($key, $value)
{
if (count($this->data) >= $this->maxSize) {
array_shift($this->data);
}
$this->data[$key] = $value;
}
}
避免使用 global 关键字的数组
class Index
{
public function index(Request $request)
{
global $data;
$data[] = time();
return response('hello');
}
}
class Index
{
public function index(Request $request)
{
$data = $request->get('data', []);
return response('hello');
}
}
内存泄漏规避建议
- 尽量不使用
global、static 关键字的数组,如果使用确保其不会无限膨胀
- 对于不熟悉的类,尽量不使用单例,用
new 关键字初始化
- 如果需要单例,检查其是否有无限膨胀的数组属性
- 使用 Redis/Memcached 等外部缓存替代内存缓存
- 定期清理数据,为长生命周期的数组设置大小限制
提示: webman 自带的 monitor 进程会监控内存使用,当内存即将达到 memory_limit 时会自动安全重启进程。
官方文档参考
详细文档请参考 references/ 目录下的官方文档。
路由配置
<?php
use Webman\Route;
Route::get('/users', [app\controller\UserController::class, 'index']);
Route::get('/users/{id}', [app\controller\UserController::class, 'show']);
Route::group('/api', function () {
Route::get('/users', [app\controller\UserController::class, 'index']);
Route::post('/users', [app\controller\UserController::class, 'store']);
});
Route::resource('/users', app\controller\UserController::class);
模型
<?php
namespace app\model;
use support\Model;
class User extends Model
{
protected $table = 'users';
protected $fillable = ['name', 'email'];
protected $hidden = ['password'];
}
中间件
<?php
namespace app\middleware;
use Webman\MiddlewareInterface;
use Webman\Http\Response;
use Webman\Http\Request;
class AuthMiddleware implements MiddlewareInterface
{
public function process(Request $request, callable $handler): Response
{
if (!$request->session()->get('user_id')) {
return json(['code' => 401, 'msg' => 'Unauthorized']);
}
return $handler($request);
}
}