使用pg_pconnect(php-fpm)有意义吗


Does it make sense to use pg_pconnect (php-fpm)

我在10台使用php-fpm的服务器上每秒大约有11000次点击。我正在从mysql迁移到postgres,所以我的问题是使用pg_*p*connect有意义吗?

最好使用像PgBouncer这样的专用连接池。

性能应该与pg_pconnect相当,但PgBouncer将允许在PHP代码中出现错误后执行清理。pg_pconnect不会自动清除打开的事务、锁、准备好的语句等。

建立到PostgreSQL服务器的连接预计要比建立到MySQL服务器的连接贵得多。这是由于这些数据库在处理资源分配和独立连接之间的权限分离方面的设计选择不同。

因此,对于一个网站来说,尽可能重用与PostgreSQL的连接是完全有意义的。

通常建议的方法不是使用pg_pconnect,而是使用更适合此任务的外部连接池,如pgBouncer或pgPoolII。然而,当使用PHP-FPM时,您已经有了一个中间件,可以通过FPM流程管理器选项以某种方式控制打开连接的数量,所以它可能足够好了。您可以考虑将pm.max_requests设置为非零值,以确保以合理的频率清理连接,并避免在非高峰时段保留大量未使用的连接。

好吧,pg_pconnect意味着每个PHP后端有一个连接,所以这取决于你有多少后端。对于传统的Apache mod php设置,这将是一个不启动的程序,但你可能会逃脱惩罚。

数据库服务器可以处理数百个空闲连接,但如果所有连接都同时发出查询,则几乎可以肯定会陷入停顿。我看到了一条经验法则,即每个核心不超过两个连接——这是假设I/O不会首先限制您。

常见的方法是运行像pgbouncer这样的连接池,并对每个请求进行php连接。这样可以减少连接开销,同时保持并发性。