2016-10-10 52 views
1

PHP的PDO(或其各自的PostgreSQL driver)是否具有用于启用TCP保持活动探针的连接配置选项like JDBCTCP Keep-Alive PDO连接参数

我遇到了一个问题,我们通过一个5分钟后断开连接的NAT进行连接(我无法更改该连接),并且我们在外部Postgres实例上运行的查询需要比运行5分钟,导致我们的客户永远不会收到来自Postgres实例的响应,并最终超时。

+0

请给我们更多的信息。你使用vps或dedi,你的操作系统和版本是什么。你有ssh登录吗? –

+0

@IvanBarayev这个信息与这个问题有什么关系?这个问题是关于为pdo的pgsql驱动程序启用tcp keep alive探针的特定配置。 –

+0

对不起,试图帮助你。祝你有美好的一天:) –

回答

3

的PDO PostgreSQL驱动是建立在libpq的客户端库的顶部。驱动程序允许以键/值对的形式在DSN中传递特定的libpq连接选项,其中包括TCP keepalives选项。

PostgreSQL doc

保活

控制是否使用客户端侧的TCP保持连接。缺省值是1,意思是,但是如果不需要保持活动,则可以将其更改为0,意味着关闭。对于通过Unix域套接字进行的连接 ,此参数将被忽略。

keepalives_idle

控制之后TCP应该发送保活消息发送到服务器的不活动的秒数。零值使用 系统默认值。对于通过 的Unix域套接字进行的连接,或者保持活动被禁用,此参数将被忽略。在TCP_KEEPIDLE或TCP_KEEPALIVE套接字 选项可用并且在Windows上的系统上仅支持 ;在其他系统上,它没有 的影响。

keepalives_interval

控制的后应重发的是不被服务器确认一个TCP保持活动消息的秒数。 A的零值使用系统默认值 。 通过Unix域套接字进行的连接或保持活动状态为 禁用时,该参数将被忽略。它仅在TCP_KEEPINTVL套接字选项可用的系统上以及Windows上受支持;在其他系统上,它有 没有效果。

例子:

<? 
$db = new PDO('pgsql:dbname=mydb;host=localhost;user=myuser;password=mypass;keepalives_idle=60'); 
?> 
+0

这正是我所期待的!谢谢! –

2

您可以更新内核存活时间:

echo 250 > /proc/sys/net/ipv4/tcp_keepalive_time 

(信用克里斯·梅里克)

+0

虽然这可能确实解决了我的问题,但它并不回答PDO的PostgreSQL驱动程序是否具有管理其tcp连接的配置选项的问题。此外,只有当客户端运行在使用Linux内核的操作系统上时,此答案才适用。 –