webman需手动集成illuminate/database实现多库支持,配置必须含'connections'数组,各连接显式声明driver,通过db::connection('name')调用,且须用vlucas/phpdotenv加载.env环境变量。

Webman 本身不内置 ORM 或数据库连接管理,需手动集成 illuminate/database(Laravel 的 DB 组件),多数据库支持完全依赖该组件的配置机制——不是靠“切换库名”,而是靠预定义多个命名连接,再按名调用。
config/database.php 中必须定义 'connections' 数组
Webman 的数据库配置文件(config/database.php)必须返回一个包含 connections 键的数组,否则 support\Db 无法识别任何连接。常见错误是只写了一个顶层连接配置,漏掉 connections 包裹层。
- 正确结构:外层是 PHP
return [ ],内部第一级键必须是'connections',其值为关联数组,每个子键是连接名(如'mysql_main'、'mysql_log') - 每个连接内必须显式声明
'driver' => 'mysql',不能省略;若用 PostgreSQL,driver必须为'pgsql',且确保已安装pdo_pgsql扩展 -
'default'键仅用于指定默认连接名(字符串),它必须与connections中某个键完全一致,拼错会导致Db::table()报Connection not found - 示例片段:
return [ 'default' => 'mysql_main', 'connections' => [ 'mysql_main' => [ 'driver' => 'mysql', 'host' => env('DB_HOST_MAIN', '127.0.0.1'), 'port' => env('DB_PORT_MAIN', 3306), 'database' => env('DB_NAME_MAIN', 'app_db'), 'username' => env('DB_USER_MAIN', 'root'), 'password' => env('DB_PASS_MAIN', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', ], 'mysql_log' => [ 'driver' => 'mysql', 'host' => env('DB_HOST_LOG', '127.0.0.1'), 'port' => env('DB_PORT_LOG', 3306), 'database' => env('DB_NAME_LOG', 'log_db'), 'username' => env('DB_USER_LOG', 'log_user'), 'password' => env('DB_PASS_LOG', ''), 'charset' => 'utf8mb4', ], ], ];
使用 Db::connection('name') 获取指定连接
Webman 的 support\Db 是对 Illuminate\Database\Connection 的封装,不支持 Db::connect()(那是 ThinkPHP 的写法)。必须用 Db::connection('mysql_log') 显式获取连接实例,否则所有操作都走 default。
- 直接查表:
Db::connection('mysql_log')->table('operation_log')->where('level', 'error')->get() - 执行原生语句:
Db::connection('mysql_main')->statement('INSERT INTO users (name) VALUES (?)', ['Alice']) - 错误高发点:传入的连接名大小写敏感,
'Mysql_log'或'mysql-log'都会报Connection not found: xxx - 不建议在循环中反复调用
Db::connection()—— 它每次都会尝试复用已有连接,但若配置有误(如 host 不可达),会阻塞并重试超时,拖慢整个请求
环境变量分离必须用 env() + .env 文件
Webman 没有自动加载 .env 的机制,env() 函数需配合 vlucas/phpdotenv 手动启用,否则 env('DB_HOST_MAIN') 始终返回 null,导致连接失败。
- 先执行
composer require vlucas/phpdotenv - 在
start.php开头(Worker::runAll()之前)加入:$dotenv = Dotenv\Dotenv::createImmutable(__DIR__); $dotenv->load();
-
.env文件必须是 UTF-8 无 BOM 格式,每行形如DB_HOST_MAIN=192.168.10.5,等号前后不能有空格 - 切勿把密码明文写死在
config/database.php中;生产环境禁用display_errors,否则泄露.env内容风险极高
多数据库最易被忽略的是连接健康检查和错误兜底:Webman 不像 Laravel 有 DB::reconnect() 自动恢复机制,一旦某连接因网络抖动断开,后续所有对该连接的调用都会抛出 PDOException。建议在关键查询前加简单探测,比如 Db::connection('mysql_log')->select('SELECT 1 AS ping')[0]['ping'] === '1',失败则记录告警并跳过非核心日志写入。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











