如果出错,pg_connect非常慢

时间:2016-01-12 10:52:52

标签: php postgresql

我有一个php脚本,用于在postgresql数据库中存储一些信息。在这个脚本中,我使用一个函数来存储关于某些数据库操作的一些日志。在测试期间,我发现我的脚本将在4-5秒后记录与pg_connect函数相关的错误 - 这对我来说是个大问题。

您可以在下面找到我的测试和结果:

案例1 - pg_connect函数没有错误:

    Log("START DBCONN - without errors");

    $dbconn = pg_connect("host=$host dbname=$dbname user=$dbuser password=$dbpassword");

        if(!$dbconn){
           Log("ERROR: Could not connect to database");
        }

    Log("END");

案例2 - pg_connect中的错误:

    Log("START DBCONN - with errors");

    $dbconn = pg_connect("host=$host12 dbname=$dbname user=$dbuser password=$dbpassword");

        if(!$dbconn){
           Log("ERROR: Could not connect to database");
        }

    Log("END");

结果

案例1:

[12-Jan-2016 09:31:21] START DBCONN - without errors

[12-Jan-2016 09:31:21] END

案例2:

[12-Jan-2016 09:31:59] START DBCONN - with errors

[12-Jan-2016 09:32:03] ERROR: Could not connect to database

[12-Jan-2016 09:32:03] END

你知道解决方案吗?因为,我找不到一个,但是:(

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

根据错误的性质,可能有不同的原因:

  • 如果用户名或密码错误,服务器可能会延迟否定响应,使强制组合变得更加繁琐。
  • 如果无法访问主机,则tcp连接超时可能需要几秒钟。

这两个问题很难以干净的方式解决。

还有一些不应导致延迟的错误情况,例如:

  • 如果主机可以访问,但数据库服务器没有运行(即"连接被拒绝")。

答案 1 :(得分:1)

可以使用connect_timeout来电中的pg_connect()选项调整无响应远程主机失败的时间。

PHP pg_connect() documentation没有提供有关connect_timeout的任何详细信息,但它只是将其传递给cp客户端库libpq,并将其记录为:

http://www.postgresql.org/docs/current/static/libpq-connect.html

  

<强> connect_timeout

     

最大等待连接,以秒为单位(写为十进制整数字符串)。零或未指定意味着无限期等待。它是   不建议使用少于2秒的超时。

然而,问题中显示的失败前4秒对于TCP问题似乎是合理的。如果您希望数据库主机出现重复出现的网络错误,则可能需要考虑使用pgBouncer等本地连接池,以使Web环境与这些高延迟错误隔离。