PHP的PDO(或它的各个PostgreSQL driver)是否有连接配置选项来启用TCP保持活动探测like JDBC?
我遇到的问题是我们通过NAT建立连接,在5分钟后丢弃连接(我无法更改),而我们在外部Postgres实例上运行的查询需要超过5个运行几分钟,导致我们的客户永远不会收到Postgres实例的响应并最终超时。
答案 0 :(得分:3)
PDO PostgreSQL驱动程序构建在libpq客户端库之上。驱动程序允许以密钥/值对的形式在DSN中传递特定的libpq连接选项,其中包括TCP keepalives选项。
<强>保活强>
控制是否使用客户端TCP keepalive。默认值为1,表示打开,但您可以将其更改为0,表示关闭,if 不想要Keepalive。连接将忽略此参数 通过Unix域套接字制作。
<强> keepalives_idle 强>
控制TCP应向服务器发送keepalive消息之前的不活动秒数。值为零使用 系统默认。对于通过的连接,将忽略此参数 Unix域套接字,或者如果禁用keepalive。它只是 在TCP_KEEPIDLE或TCP_KEEPALIVE套接字的系统上受支持 选项可用,在Windows上;在其他系统上,它没有 效果。
<强> keepalives_interval 强>
控制应重新传输服务器未确认的TCP keepalive消息的秒数。一个 零值使用系统默认值。该参数被忽略 通过Unix域套接字建立的连接,或者如果是keepalive 禁用。它仅在TCP_KEEPINTVL的系统上受支持 套接字选项可用,并且在Windows上;在其他系统上,它有 没有效果。
示例:
<?
$db = new PDO('pgsql:dbname=mydb;host=localhost;user=myuser;password=mypass;keepalives_idle=60');
?>
答案 1 :(得分:2)
您可以更新内核保持活动时间:
echo 250 > /proc/sys/net/ipv4/tcp_keepalive_time
(信任Chris Merrick)