[英]php postgresql persistent connections always close
我在一台服务器上有一个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
可以看到两个服务器之间没有已建立的连接。 我还需要做什么来保持连接打开? 每个请求的新连接开销为10-12毫秒。
我发现此说明是在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 ms而不是10 ms。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.