php postgresql持久连接总是关闭

时间:2016-07-06 02:22:07

标签: php apache postgresql pdo

我在一台服务器上有一个Apache / PHP应用程序,在第二台服务器上有一个PostgreSQL数据库。它们配置为通过SSL连接。一切正常,但即使$db->setAttribute(PDO::ATTR_PERSISTENT, true);在脚本中,TCP连接也始终关闭。 PHP.INI有pgsql.allow_persistent = On pgsql.auto_reset_persistent = Off pgsql.max_persistent = 30pgsql.max_links = 30。使用sudo netstat -nap我可以看到两台服务器之间没有ESTABLISHED连接。我还需要做些什么才能保持连接畅通?每个请求的新连接开销为10-12 ms。

1 个答案:

答案 0 :(得分:0)

我在一本php手册页面上找到了这个笔记:

  

如果您希望使用持久连接,则必须进行设置   传递给PDO的驱动程序选项数组中的PDO :: ATTR_PERSISTENT   构造函数。如果在之后使用PDO :: setAttribute()设置此属性   实例化对象,驱动程序不会使用持久化   连接。

那是我出错的地方。我正在使用它:

$host = explode('.',$_SERVER['SERVER_NAME']);
$db = new PDO($host[0]);
$db->setAttribute(PDO::ATTR_PERSISTENT, true);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

当我应该这样做时:

$host = explode('.', $_SERVER['SERVER_NAME']);
$db = new PDO($host[0],null,null,array(PDO::ATTR_PERSISTENT=>true,
      PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,
      PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC));

DSN位于pdo.ini文件中。幸运的是,忽略了空用户和密码,否则这也无法正常工作。现在new PDO需要0.02毫秒而不是10毫秒。