PHP/PDO能否使用PostgreSQL simple query查询模式?
PostgreSQL PDO强制使用simple查询模式解决方案
原生PDO配置方式
PDO_PGSQL扩展提供了内置参数控制查询模式,你只需要在初始化PDO连接时开启PDO::PGSQL_ATTR_DISABLE_PREPARES属性即可禁用服务器端预处理,强制走simple query协议:
$pdo = new PDO( 'pgsql:host=你的PgBouncer地址;port=端口;dbname=数据库名', '数据库用户名', '数据库密码', [ PDO::PGSQL_ATTR_DISABLE_PREPARES => true, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ] );
开启该参数后,所有查询都会走客户端参数拼接的simple模式,不会发送extended协议对应的Parse/Bind/Execute报文,刚好适配不支持extended模式的PgBouncer实例。
Symfony/Doctrine配置方式
你可以直接在Doctrine的DBAL配置中添加该PDO属性,修改config/packages/doctrine.yaml配置如下:
doctrine: dbal: driver: 'pdo_pgsql' host: '%env(DATABASE_HOST)%' port: '%env(DATABASE_PORT)%' dbname: '%env(DATABASE_NAME)%' user: '%env(DATABASE_USER)%' password: '%env(DATABASE_PASSWORD)%' options: !php/const PDO::PGSQL_ATTR_DISABLE_PREPARES: true
修改完成后执行php bin/console cache:clear清理Symfony缓存即可生效,不会再出现ERROR: unsupported pkt type: 80报错。
注意事项
- 该模式下参数转义由PDO客户端完成,请确保PHP端和数据库端字符集配置一致,建议统一使用UTF8避免注入风险。
- 如果你同时存在直连PostgreSQL和对接PgBouncer的多个连接,只需要给对接PgBouncer的连接添加该配置即可,其他连接不受影响。
内容的提问来源于stack exchange,提问作者Adam Williams
相关产品推荐
相关产品推荐

