webman 通过 illuminate/database 支持 postgresql,但需手动配置 pgsql 连接块(含 driver、schema、sslmode、port),并确保 php 已启用 pgsql/pdo_pgsql 扩展;postgis 查询须用原生 sql 避免 orm 限制,多库事务需补偿机制兜底。

Webman 本身不自带 PostgreSQL 驱动,它依赖 illuminate/database(Laravel 的数据库组件)做底层封装,所以 PostgreSQL 支持是完整的,但配置和用法必须严格匹配其约定——不是“装上就能用”,而是“配错一步就查不到数据”。
PostgreSQL 连接配置必须显式启用 pgsql 驱动
Webman 的 config/database.php 中默认只启用 mysql 连接,PostgreSQL 需手动添加 pgsql 配置块,且不能漏掉关键字段:
-
'driver' => 'pgsql':必须是字符串pgsql,不是postgre、postgresql或pg -
'schema' => 'public':PostgreSQL 默认 schema 是public,不设或设错会导致表找不到(哪怕表真实存在) -
'sslmode' => 'prefer':本地开发可保留默认;生产环境若启用了 SSL,需同步调整为require并提供证书路径 - 端口必须是
5432(除非你改过 PostgreSQL 配置),port字段不能省略或写成字符串"5432"(PHP 会类型校验失败)
使用 Db::connection('pgsql') 前先确认扩展已加载
即使配置写对了,Db::connection('pgsql') 仍可能抛出 Driver not supported 错误——根本原因是 PHP 缺少 pgsql 和 pdo_pgsql 扩展。
Webman 2.2.0版本强化了 TCP/UDP 服务支持,优化路由组管理,并增强异步任务处理能力。结合协程与连接池技术,Webman 能轻松应对高并发场景,适用于网站、接口服务、即时通讯、物联网及游戏开发,兼具高性能、灵活扩展与稳定可靠,是多场景 PHP 服务开发的理想选择。
- Ubuntu/Debian 下执行:
sudo apt install php-pgsql php-pdo-pgsql,然后重启 PHP-FPM 或 Webman 进程 - 检查是否生效:
php -m | grep pgsql应输出两行:pgsql和pdo_pgsql - 如果用的是 Docker,Dockerfile 中需包含
docker-php-ext-install pdo_pgsql pgsql - 别信
extension=pgsql写在php.ini就万事大吉——有些发行版把扩展放在/etc/php/*/mods-available/下,还需phpenmod pgsql
PostGIS 空间查询必须绕过 ORM 直接走原生 SQL
Webman 的 Db 查询构建器不支持 ST_SetSRID、ST_DWithin 这类 PostGIS 函数的链式调用,强行用 whereRaw 容易因参数绑定顺序错乱导致坐标反置(lat/lng 混淆)或 SRID 缺失。
- 正确做法是用
Db::connection('pgsql')->select()执行完整 SQL:
DB::connection('pgsql')->select(
"SELECT id, name, ST_AsGeoJSON(geom) as geojson
FROM locations
WHERE ST_DWithin(geom, ST_SetSRID(ST_MakePoint(:lng, :lat), 4326), :radius)",
['lng' => $lng, 'lat' => $lat, 'radius' => 1000]
);
ST_MakePoint(:lng, :lat) —— PostGIS 要求先经度后纬度,前端传来的 lat, lng 必须交换顺序geom 字段,10 万条数据下 ST_DWithin 查询可能 >2s;必须补:CREATE INDEX idx_locations_geom ON locations USING GIST (geom);
多库事务无法原子提交,得靠补偿逻辑兜底
Webman 的 Db::transaction() 只作用于单个连接。如果你同时操作 mysql(业务库)和 pgsql(地理库),try...catch 里的 rollback() 只能回滚其中一个库。
- 典型场景:用户注册(MySQL 写 user 表)+ 地理围栏初始化(PostgreSQL 写 location 表)
- 不能依赖
DB::transaction包裹两个连接的操作 - 可行方案:先写 MySQL,成功后再写 PostgreSQL;若 PostgreSQL 失败,触发异步任务重试或发告警人工介入
- 更稳妥的做法是把地理数据也挪到 MySQL(用
POINT类型 +ST_DistanceSphere),避免跨库事务
最常被忽略的点:PostgreSQL 的错误提示默认不显示 SQL 全文,只报 PDOException,调试时务必在 config/database.php 的 pgsql 配置里加上 'options' => [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION],否则连哪条语句错了都看不到。










