webman支持多数据库操作,需在config/database.php中配置多个连接,通过db::connection('name')调用指定连接,model可通过$connection属性绑定,插件库需用plugin.{name}.{conn}格式命名,跨库事务不支持,须用补偿机制保证一致性。

如果您在Webman项目中需要同时操作多个数据库,例如主业务库与日志库分离、读写分离或插件独立数据库,必须通过显式配置连接名并正确调用对应连接实例来实现。以下是解决此问题的步骤:
一、在config/database.php中定义多个连接
每个数据库连接需在connections数组下以唯一键名声明,支持不同驱动、主机、库名及认证信息,互不干扰。同一驱动可配置多个实例(如mysql和mysql2),也可混合MySQL、PostgreSQL、SQLite等。
1、打开config/database.php文件,定位到'connections'数组内部。
2、添加第二个MySQL连接配置,键名为'mysql2',内容如下:
'mysql2' => ['driver' => 'mysql', 'host' => '192.168.1.100', 'port' => 3306, 'database' => 'log_db', 'username' => 'log_user', 'password' => 'log_pass', 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '']
3、保存文件后重启Webman服务(php start.php restart),使新配置生效。
二、在代码中按名称调用指定数据库连接
Webman基于illuminate/database,通过Db::connection('连接名')获取独立查询构建器实例,所有后续操作均绑定该连接,不会影响默认或其他连接。
1、在控制器或服务类中引入support\Db命名空间。
2、使用Db::connection('mysql2')执行查询,例如获取日志表全部记录:
$logs = Db::connection('mysql2')->table('sys_log')->where('level', 'error')->get();
3、若需执行原生SQL,仍需指定连接:
$result = Db::connection('mysql2')->select("SELECT COUNT(*) as cnt FROM sys_log WHERE created_at > ?", [date('Y-m-d H:i:s', time() - 86400)]);
三、为Model类指定专属数据库连接
模型类可通过$connection属性强制绑定特定连接,避免每次查询手动指定,适用于长期固定归属某库的业务模型。
1、在app/model/LogRecord.php中定义模型类:
class LogRecord extends Model { protected $connection = 'mysql2'; protected $table = 'sys_log'; }
2、调用ORM方法时自动使用mysql2连接:
Webman 2.2.0版本强化了 TCP/UDP 服务支持,优化路由组管理,并增强异步任务处理能力。结合协程与连接池技术,Webman 能轻松应对高并发场景,适用于网站、接口服务、即时通讯、物联网及游戏开发,兼具高性能、灵活扩展与稳定可靠,是多场景 PHP 服务开发的理想选择。
$latestError = LogRecord::where('level', 'error')->latest()->first();
3、若模型需动态切换连接,可在运行时调用on()方法:
$backupLog = LogRecord::on('mysql')->where('id', 1001)->first();
四、插件级数据库隔离配置
插件可拥有完全独立的数据库配置文件,避免与主项目或其它插件冲突,通过命名空间前缀实现连接路径隔离。
1、在插件目录plugin/foo/config/database.php中返回配置数组,包含'default'及多个'connections'项。
2、连接名需遵循plugin.{插件名}.{连接键}格式,例如'plugin.foo.mysql'。
3、在插件代码中调用时明确指定完整路径:
$order = Db::connection('plugin.foo.mysql')->table('orders')->find(123);
4、若插件需复用webman-admin的数据库配置,可直接引用plugin.admin.mysql连接名:
$adminUser = Db::connection('plugin.admin.mysql')->table('user')->where('status', 1)->get();
五、跨数据库事务与数据一致性处理
Webman本身不提供跨连接事务支持,每个Db::connection()实例维护独立连接与事务上下文,无法保证多库原子性提交。
1、单库事务必须在同一次connection()调用链内完成:
Db::connection('mysql2')->transaction(function ($db) { $db->table('sys_log')->insert(['msg' => 'start']); $db->table('sys_log')->insert(['msg' => 'end']); });
2、涉及多库操作时,须采用业务层补偿机制:先提交主库,成功后再异步写入日志库,失败则触发告警并记录失败快照。
3、禁止在事务块中混用不同连接实例,例如在mysql2事务内调用Db::connection('mysql')->update()将导致事务失效且无错误提示。










