Webman 中 Eloquent 必须在 onWorkerStart 初始化、显式声明 $connection、严格对齐表结构字段、用 -W 安装依赖并手动处理跨库事务。

不能直接照搬 Laravel 的用法,否则连接数暴涨、查错库、时间戳报错是必然结果。
onWorkerStart 是唯一安全的初始化位置
Eloquent 初始化一旦放在控制器、中间件或 onMessage 里,每个请求都会新建 Capsule 实例和 PDO 连接,Worker 进程驻留期间连接句柄不会释放,MySQL 很快报 Too many connections。
- 必须在
support/Bootstrap.php或独立启动器中监听Worker::onWorkerStart,且只执行一次 - 调用
Capsule::setAsGlobal()前,'options' => [PDO::ATTR_PERSISTENT => false]必须显式设置,否则协程切换时连接无法回收 - 避免多个 Bootstrap 类重复触发
Capsule::bootEloquent(),可加静态标记判断是否已初始化 - 若项目已引入
webman/database包,就别手动 new Capsule——改用Db::connection('mysql_log')获取连接实例
每个模型必须显式声明 $connection
Webman 没有 Laravel 那套自动绑定 default 连接的机制,config/database.php 里的 default 只影响 Db::table() 这类无模型查询;Eloquent 模型不设 $connection 就等于随机走库。
Webman 2.2.0版本强化了 TCP/UDP 服务支持,优化路由组管理,并增强异步任务处理能力。结合协程与连接池技术,Webman 能轻松应对高并发场景,适用于网站、接口服务、即时通讯、物联网及游戏开发,兼具高性能、灵活扩展与稳定可靠,是多场景 PHP 服务开发的理想选择。
- 在
app/model/User.php类内写protected $connection = 'mysql_log';,值必须和config/database.php中connections.mysql_log键完全一致(大小写敏感) - 动态切库可用
User::on('mysql_backup')->find(1),但每次调用都会新建连接,高并发慎用 - 若用
webman/database,它的Dbfacade 不支持 Eloquent 的on()方法,只能靠模型属性控制连接归属
时间戳、主键、软删除字段必须与表结构严格对齐
Webman 没有 artisan 命令自动推导表结构,Eloquent 不扫描数据库,所有字段行为全靠模型显式声明。错配立刻 SQL 报错或查不到数据。
- 表里没有
created_at/updated_at?必须加public $timestamps = false; - 主键叫
user_id而不是id?必须写protected $primaryKey = 'user_id'; - 数据库用 int 时间戳?得配
protected $dateFormat = 'U'; - 软删除字段是
is_deleted?得同步改protected $softDelete = 'is_deleted';并配protected $casts = ['is_deleted' => 'boolean'];
composer require illuminate/database 必须带 -W 参数
直接 composer require illuminate/database 极大概率装出残缺依赖:illuminate/support 版本错位、symfony/polyfill 缺失、甚至 Illuminate\Database\Connect 类找不到。
- 务必加
-W(--with-all-dependencies),强制拉取完整兼容链:composer require illuminate/database -W - 装完后运行
composer dump-autoload,否则app/model/下模型类可能提示 Class not found - 检查
composer.json是否已存在"webman/support": "^1.5.0",版本低于 1.5.0 会导致support\Model无法继承
最易被忽略的一点:事务跨库时,Eloquent 的 DB::transaction() 不生效,必须手动两阶段提交——先 commit 主库,再 try-catch 提交从库,失败则回滚主库并抛异常。

















