必须加--enable-coroutine-postgresql,否则swoolecoroutinepostgresql类不会被编译进扩展,运行时报class not found;需提前安装libpq开发包并指定路径,启用后通过php --ri swoole或class_exists验证。

编译时必须加 --enable-coroutine-postgresql
不加这个参数,SwooleCoroutinePostgreSQL 类根本不会被编译进扩展里,运行时直接报 Class 'SwooleCoroutinePostgreSQL' not found。这不是 autoload 或配置问题,是底层符号缺失。
它依赖系统级的 libpq(PostgreSQL 客户端库),不是纯 PHP 实现。所以:
• 编译前得先装 postgresql-devel(CentOS/RHEL)或 libpq-dev(Ubuntu/Debian)
• 如果 PostgreSQL 是非标路径安装(比如 /opt/pgsql),必须用 --with-libpq-dir=/opt/pgsql 显式指定
• 不要和 --enable-async-postgresql 混淆——Swoole 从 4.0 起只提供协程版,没有异步回调版
php.ini 里不用额外配,但得确认 extension=swoole.so 已加载
启用 --enable-coroutine-postgresql 后,功能是静态编译进 swoole.so 的,不需要单独 extension 或额外 ini 配置项。
验证是否生效最直接的方法:
• 运行 php --ri swoole,在输出里找 coroutine_postgresql => enabled
• 或写一行代码:var_dump(class_exists('Swoole\Coroutine\PostgreSQL'));,返回 true 才算成功
• 注意:如果 php -m | grep swoole 显示已加载,但 class_exists 是 false,基本就是编译漏了参数或 libpq 头文件没找到
连接字符串格式必须严格匹配 libpq 规则
SwooleCoroutinePostgreSQL->connect() 只接受 libpq 原生格式的连接字符串,不支持 URL 形式(如 postgresql://...)或键值对数组。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
正确写法只有两种:
• 空格分隔的 key=value 对:"host=127.0.0.1 port=5432 dbname=test user=pguser password=pgpass"
• 简化形式(省略默认值):"dbname=test user=pguser"(自动走 localhost:5432)
• 错误示例:["host" => "localhost"]、"postgresql://..."、"host=localhost;dbname=test"(分号不是 libpq 分隔符)
连不上时先用命令行验证:psql "host=... dbname=...",能通再查 PHP 侧;否则优先排查防火墙、pg_hba.conf 权限、密码加密方式(md5/scram-sha-256)
协程上下文里不能混用同步 PostgreSQL 扩展
一旦启用了 --enable-coroutine-postgresql,就别在同一个协程里调 pg_connect() 或 PDO::pgsql。它们会阻塞整个协程,破坏并发模型。
常见踩坑点:
• 在 go(function () { ... }) 里同时用了 SwooleCoroutinePostgreSQL 和 pg_query() → 协程挂起,后续请求卡死
• Composer 加了 ext-pgsql 依赖,但没意识到它和 Swoole 协程版不兼容
• 使用框架(如 Hyperf)时,配置里没关掉传统 PDO 连接池,导致协程调度混乱
解决办法很直接:全栈统一用 SwooleCoroutinePostgreSQL,删掉所有 pg_* 函数调用和 PDO 实例。它的 API 足够覆盖建连、查询、事务、预处理等全部场景,只是返回值结构略有不同。










