【问题标题】:TCP Keep-Alive PDO Connection ParameterTCP Keep-Alive PDO 连接参数
【发布时间】:2017-02-19 03:13:24
【问题描述】:

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

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

【问题讨论】:

  • 请给我们更多信息。您正在使用 vps 或 dedi,您的操作系统和版本是什么。你ssh登录了吗?
  • @IvanBarayev 这些信息与这个问题有什么关系?这个问题是关于 pdo 的 pgsql 驱动程序的特定配置,以启用 tcp keep alive 探测。
  • 很抱歉帮助您。祝你有美好的一天:)

标签: php postgresql pdo tcp keep-alive


【解决方案1】:

可以更新内核keepalive时间:

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

(感谢克里斯·梅里克)

【讨论】:

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

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

来自PostgreSQL doc

保活

控制是否使用客户端 TCP keepalive。默认值为 1,表示开启,但您可以将其更改为 0,表示关闭,如果 不需要keepalives。连接忽略此参数 通过 Unix 域套接字制作。

keepalives_idle

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

keepalives_interval

控制重新传输未被服务器确认的 TCP keepalive 消息的秒数。一种 零值使用系统默认值。该参数被忽略 通过 Unix 域套接字建立的连接,或者如果 keepalives 是 禁用。它仅在 TCP_KEEPINTVL 的系统上受支持 套接字选项可用,并且在 Windows 上;在其他系统上,它有 没有效果。

例子:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-07
    • 2016-02-10
    • 2013-03-25
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多