pg_pconnect

(PHP 4, PHP 5, PHP 7, PHP 8)

pg_pconnect打开持久 PostgreSQL 连接

说明

pg_pconnect(string $connection_string, int $flags = 0): PgSql\Connection|false

pg_pconnect() 打开到 PostgreSQL 数据库的连接。它返回一个 PgSql\Connection 实例,其他 PostgreSQL 函数需要此实例。

如果对 pg_pconnect() 进行第二次调用,并且 connection_string 与现有连接相同,则将返回现有连接,除非您将 PGSQL_CONNECT_FORCE_NEW 作为 flags 传递。

若要启用持久连接,pgsql.allow_persistent php.ini 指令必须设置为 "On"(默认值)。持久连接的最大数量可以通过 pgsql.max_persistent php.ini 指令定义(默认为 -1,表示无限制)。连接的总数可以通过 pgsql.max_links php.ini 指令设置。

pg_close() 不会关闭由 pg_pconnect() 生成的持久链接。

参数

connection_string

connection_string 可以为空以使用所有默认参数,也可以包含一个或多个用空格分隔的参数设置。每个参数设置的形式为 keyword = value。等号周围的空格是可选的。若要写入空值或包含空格的值,请将其用单引号括起来,例如 keyword = 'a value'。值中的单引号和反斜杠必须用反斜杠转义,即 \' 和 \\。

当前识别的参数关键字是:hosthostaddrportdbnameuserpasswordconnect_timeoutoptionstty(忽略)、sslmoderequiressl(已弃用,建议使用 sslmode)和 service。这些参数中哪些存在取决于您的 PostgreSQL 版本。

flags

如果传递了 PGSQL_CONNECT_FORCE_NEW,则即使 connection_string 与现有连接相同,也会创建新的连接。

返回值

如果成功,则返回 PgSql\Connection 实例,如果失败,则返回 false

变更日志

版本 说明
8.1.0 现在返回 PgSql\Connection 实例;以前返回 资源

示例

示例 #1 使用 pg_pconnect()

<?php
$dbconn
= pg_pconnect("dbname=mary");
// 连接到名为 "mary" 的数据库

$dbconn2 = pg_pconnect("host=localhost port=5432 dbname=mary");
// 连接到 "localhost" 上端口 "5432" 上名为 "mary" 的数据库

$dbconn3 = pg_pconnect("host=sheep port=5432 dbname=mary user=lamb password=foo");
// 连接到 "sheep" 主机上的名为 "mary" 的数据库,使用用户名和密码

$conn_string = "host=sheep port=5432 dbname=test user=lamb password=bar";
$dbconn4 = pg_pconnect($conn_string);
// 连接到 "sheep" 主机上的名为 "test" 的数据库,使用用户名和密码
?>

参见

添加备注

用户贡献的备注 7 个备注

0
Dennis Fogg
16 年前
截至 2007 年 8 月,来自 postgresql 论坛的一些建议
关于 pg_pconnect()、更快的 postgres 连接和连接池

摘要
http://archives.postgresql.org/pgsql-general/2007-08/msg01406.php

详细内容:http://archives.postgresql.org/pgsql-general/2007-08/msg00660.php
还有:http://archives.postgresql.org/pgsql-general/2007-08/msg01489.php
-1
robertb
15 年前
您不应该使用 pg_pconnect - 它已损坏。它会工作,但它实际上并没有池化,而且它的行为不可预测。它只会让您增加 postgresql.conf 文件中的 max_connections 参数,直到您耗尽资源(这将减慢数据库速度)。

如果您对数据库有许多并发连接,您应该使用 PostgreSQL 连接池 PgBouncer(由 Skype 团队开发)。使用 pgbouncer 时,请确保您使用 pg_connect 而不是 pg_pconnect。此外,请确保您使用 pg_close 关闭连接。

* PGBouncer 主页
http://developer.skype.com/SkypeGarage/DbProjects/PgBouncer

* Last.fm 关于 PostgreSQL 池的文章
http://www.last.fm/user/Russ/journal/2008/02/21
/zd_postgres_connection_pools:_pgpool_vs._pgbouncer
-1
Spiros Ioannou
21 年前
您不妨尝试减少 apache 中的 MaxClients,而不是减少
php 中的 pgsql.max_links,至少要减少到
postmasters 的数量。它应该可以工作,并且可以留下
更多可用的 httpds 用于静态 html 页面。
-2
garrett at bgb dot cc
22 年前
如果在页面处理结束时正在进行事务,则在将连接放回池中之前是否会中止该事务?或者连接是以 "按原样" 添加的?

看起来应该在添加到池之前始终 "中止"。

作为备注,现在是检查连接是否仍然打开的好时机,然后再将其重新添加。这样一来,随着时间的推移,关闭的连接就会被清理,而不是像现在这样永远挂在那里。
-3
ts at dev dot websafe dot pl
16 年前
<?php
//
// 在类中使用 pg_pconnect。
//
// 为什么这样做?因为手册中提到:
//
// 如果使用与现有连接相同的 connection_string 对 pg_pconnect() 进行第二次调用,
// 将返回现有连接,除非你传递了 PGSQL_CONNECT_FORCE_NEW 作为 connect_type。
//
// 这种说法并不总是正确。
//
/**
* MyClassA 使用 pg_pconnect 创建 PostgreSQL 连接,
* 并将得到的资源 ID 存储在 $this->conn 中
*/
class MyClassA
{
function
__construct($connection_string)
{
$this->conn =
pg_pconnect($connection_string)
or die(
'错误的 CONN_STRING');
}
}

//
// 显示当前 php.ini 设置,以确保
// 允许持久连接。
// -1 表示“无限制”
//
echo '<br>pgsql.allow_persistent: ' . ini_get('pgsql.allow_persistent');
echo
'<br>pgsql.max_persistent: ' . ini_get('pgsql.max_persistent');
echo
'<br>pgsql.max_links: ' . ini_get('pgsql.max_links');
echo
'<br><br>';

// 为所有对象设置一个自定义连接字符串
// (修改 $connection_string 以适应你的需求)
$connection_string =
'host=localhost port=5432' .
' dbname=test user=test password=test';

//
// 使用相同的 $connection_string 创建 10 个 MyClassA 对象
//
$objArr = Array();
for (
$i = 0; $i < 10; $i++)
{
$objArr[] = new MyClassA($connection_string);
}

//
// 人类可读的结果:
//
foreach($objArr as $id => $object)
{
printf(
'%s: Object %s: using db %s<br>',
get_class($object), $id, $object->conn
);
}

/* ------------------------------------------------------------- */
// 结果
// pgsql.allow_persistent: 1
// pgsql.max_persistent: -1
// pgsql.max_links: -1
//
// MyClassA: Object 0: using db Resource id #2
// MyClassA: Object 1: using db Resource id #3
// MyClassA: Object 2: using db Resource id #4
// MyClassA: Object 3: using db Resource id #5
// MyClassA: Object 4: using db Resource id #6
// MyClassA: Object 5: using db Resource id #7
// MyClassA: Object 6: using db Resource id #8
// MyClassA: Object 7: using db Resource id #9
// MyClassA: Object 8: using db Resource id #10
// MyClassA: Object 9: using db Resource id #11
//
/* ------------------------------------------------------------- */
//
// 每个 MyClassA 对象都将使用它自己的数据库资源 ID
//
?>
-2
raggaflo at libertysurf dot fr
22 年前
在使用 Apache/PHP 动态模块/PostgreSQL 时要小心
在 httpd.conf (Apache 配置文件) 中,默认的 MaxClients 为 150,而默认的 PG 的 max_connections 为 32,远小于 150。你需要将 max_connections 设置为至少 MaxClients (以及 pg 的 shared_buffers 设置为至少 2*max_connections),以避免 PG 在使用 pg_pconnect 时出现“Sorry, too many clients already connected” 这样的错误。
-3
etsysx dot i dot hate dot spam at teleline dot es
22 年前
要使用 Apache 作为静态模块和 PostgreSQL 设置高可用性服务器,请修改 httpd.conf 并将 MaxClients 设置为小于 PostgreSQL 同时连接的最大数量(例如 32 或 64)。
通过这种方式,在高流量或请求流攻击的情况下,pg_pconnect 始终会返回有效的句柄,而不会浪费资源或出现连接问题。
To Top