我在一台服务器上有一个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 = 30
和pgsql.max_links = 30
。使用sudo netstat -nap
我可以看到两台服务器之间没有ESTABLISHED连接。我还需要做些什么才能保持连接畅通?每个请求的新连接开销为10-12 ms。
答案 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毫秒。