TCP keepalive PDO连接参数


TCP Keep-Alive PDO Connection Parameter

PHP的PDO(或者它各自的PostgreSQL驱动程序)是否有一个连接配置选项来启用TCP保持活动探测,如JDBC?

我遇到了一个问题,我们正在通过NAT进行连接,该连接在5分钟后断开(我无法改变这一点),并且我们在外部Postgres实例上运行的查询需要超过5分钟才能运行,导致我们的客户端从未收到Postgres实例的响应,最终超时

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

From PostgreSQL doc:

keepalives

控制是否使用客户端TCP keepalive。默认值为1,表示打开,但您可以将其更改为0,表示关闭不需要Keepalives。连接时忽略此参数通过unix域套接字创建。

keepalives_idle

控制不活动的秒数,在此秒数之后TCP应该向服务器发送keepalive消息。一个没有用处的值系统默认值。通过建立的连接忽略此参数unix域套接字,或者禁用keepalive。这只是TCP_KEEPIDLE或TCP_KEEPALIVE套接字的系统支持选项可用,并且在Windows上;在其他系统上,它没有效果。

keepalives_interval

控制未被服务器确认的TCP keepalive消息应重传的秒数。一个0的值采用系统默认值。该参数将被忽略通过unix域套接字或keepalive进行的连接禁用。仅在TCP_KEEPINTVLsocket选项可用,并且在Windows上;在其他系统上,它有没有影响。

的例子:

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

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

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

(来源:Chris Merrick)