TCP Keep-Alive PDO连接参数

时间:2016-10-10 16:24:26

标签: php postgresql pdo tcp keep-alive

PHP的PDO(或它的各个PostgreSQL driver)是否有连接配置选项来启用TCP保持活动探测like JDBC

我遇到的问题是我们通过NAT建立连接,在5分钟后丢弃连接(我无法更改),而我们在外部Postgres实例上运行的查询需要超过5个运行几分钟,导致我们的客户永远不会收到Postgres实例的响应并最终超时。

2 个答案:

答案 0 :(得分:3)

PDO PostgreSQL驱动程序构建在libpq客户端库之上。驱动程序允许以密钥/值对的形式在DSN中传递特定的libpq连接选项,其中包括TCP keepalives选项。

来自PostgreSQL doc

  

<强>保活

     

控制是否使用客户端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)