【问题标题】:Why can't increase Connect Timeout?为什么不能增加连接超时?
【发布时间】:2017-10-06 06:43:31
【问题描述】:

这是我的设置:

$DBH = new PDO(
        "pgsql:host=$host;dbname=$dbname", 
        $username, 
        $password,
        array(
            PDO::ATTR_TIMEOUT => 60,
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        )
    );

20 秒后超时。 但是如果我设置PDO::ATTR_TIMEOUT => 5,它会在5s后超时。

为什么不能增加连接超时? 我使用 xampp 3.2.2,数据库 Postgresql 9.2 我在本地测试,没有杀毒软件。

【问题讨论】:

  • 你得到什么错误?可能是正在关闭连接的服务器?你能检查一下服务器日志和设置吗?
  • 您应该告诉我们更多有关您的基础架构的信息,它可能是服务器设置,也可能是代理超时(我之前看到负载均衡器超时,我花了一些时间才弄清楚)可能是任何东西这通常会使连接超时!

标签: php postgresql pdo


【解决方案1】:

PDO::ATTR_TIMEOUTdefault_socket_timeout INI 设置是您可以从 PHP 更改的唯一值,但 TCP 连接可能会受到很多因素的影响。

在客户端,防火墙或操作系统本身也可能应用超时限制。
在传输过程中,任何中间对等点(您的路由器、ISP)也可以根据各种规则断开连接。

但最重要的是(即在您的情况下更有可能),连接涉及两方,并且 PostgreSQL 服务器也有自己的超时设置 - tcp_keepalives_idletcp_keepalives_intervaltcp_keepalives_countauthentication_timeout

参考:https://www.postgresql.org/docs/current/static/runtime-config-connection.html

您无法猜测到底是什么影响了您,而且您可能需要更改多个设置。尽可能检查上述各项。

【讨论】:

    【解决方案2】:

    如果你想找出它超时的原因,在块之后执行PDO::errorInfo

    http://php.net/manual/de/pdo.errorinfo.php

    而超时可能来自另一方,为什么当数据库响应在 20 秒后超时时脚本要等待 60 秒。

    【讨论】:

      【解决方案3】:

      在连接前使用ini_set("default_socket_timeout", 60);

      【讨论】:

      • 还有其他设置吗?
      【解决方案4】:

      随便放

      ini_set("default_socket_timeout", 50);
      before your PDO() connect string.
      

      【讨论】:

      • 我试过了,但它不起作用并且 php.ini 设置 default_socket_timeout=60
      猜你喜欢
      • 1970-01-01
      • 2017-10-30
      • 2013-08-15
      • 2018-12-08
      • 1970-01-01
      • 2013-04-08
      • 2018-04-17
      • 2016-05-08
      相关资源
      最近更新 更多