(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 数据库的持久连接。返回其它 PostgreSQL 函数所需要的 PgSql\Connection 实例。

如果使用与已有连接相同的 connection_stringpg_pconnect() 进行第二次调用,则将返回已有连接,除非将 PGSQL_CONNECT_FORCE_NEW 传递给 flags

要打开持久连接功能,php.ini 中的 pgsql.allow_persistent 参数必须为 "On"(也是默认值)。最大持久连接数目由 php.ini 中的 pgsql.max_persistent 参数定义(默认为 -1 表示没有限制)。所有连接的数目可由 php.ini 中的 pgsql.max_links 参数设置。

pg_close() 不能关闭由 pg_pconnect() 打开的持久连接。



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

当前可识别的参数关键字是:hosthostaddrportdbnameuserpasswordconnect_timeoutoptionstty(已忽略)、sslmoderequiressl(已弃用以支持 sslmode)和 service。存在哪些参数取决于 PostgreSQL 版本。


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


成功时返回 PgSql\Connection 实例, 或者在失败时返回 false


版本 说明
8.1.0 现在返回 PgSql\Connection 实例;之前返回 resource


示例 #1 使用 pg_pconnect()

= pg_pconnect("dbname=mary");
//connect to a database named "mary"

$dbconn2 = pg_pconnect("host=localhost port=5432 dbname=mary");
// connect to a database named "mary" on "localhost" at port "5432"

$dbconn3 = pg_pconnect("host=sheep port=5432 dbname=mary user=lamb password=foo");
//connect to a database named "mary" on the host "sheep" with a username and password

$conn_string = "host=sheep port=5432 dbname=test user=lamb password=bar";
$dbconn4 = pg_pconnect($conn_string);
//connect to a database named "test" on the host "sheep" with a username and password


add a note

User Contributed Notes 7 notes

Dennis Fogg
16 years ago
As of Aug 2007, some suggestions from the postgresql forums
on pg_pconnect(), faster postgres connections, and connection pooling:


Good details:
15 years ago
You should not use pg_pconnect - it's broken. It will work but it doesn't really pool, and it's behaviour is unpredictable. It will only make you rise the max_connections parameter in postgresql.conf file until you run out of resources (which will slow your database down).

If you have many concurrent connections to your database, you should use the PostgreSQL connection pooler PgBouncer (developed by the Skype-team). When using pgbouncer, make sure you use pg_connect and NOT pg_pconnect. Also, make sure you close your connections with pg_close.

* PGBouncer homepage:

* PostgreSQL pooling article by
garrett at bgb dot cc
22 years ago
If a transaction is in progress when page processing ends, is it aborted before the connection placed bak in the pool? Or is the connection added "as is"?

It would seem that the correct thing to do is to always 'ABORT' before adding to the pool.

As a note, this would be a good time to check and see if the connection is still open before readding it. Thus allowing closed connections to be cleaned up over time, instead of hanging around for ever as they do now.
Spiros Ioannou
21 years ago
Instead of reducing MaxClients in apache you may try to
reduce pgsql.max_links in php to at least the number of
postmasters. It should work and leave
you with more available httpds for static html pages.
ts at dev dot websafe dot pl
16 years ago
// Using pg_pconnect in a class.
// Why this? Because the manual says:
// If a second call is made to pg_pconnect() with the same
// connection_string as an existing connection, the existing
// connection will be returned unless you pass
// PGSQL_CONNECT_FORCE_NEW as connect_type.
// This is not always true.
* MyClassA creates a postgresql connection using pg_pconnect
* and stores the resulting resource id to $this->conn
class MyClassA
$this->conn =
or die(

// Showing current php.ini settings to be sure
// that persistent connections s are allowed.
// -1 means 'unlimited'
echo '<br>pgsql.allow_persistent: ' . ini_get('pgsql.allow_persistent');
'<br>pgsql.max_persistent: ' . ini_get('pgsql.max_persistent');
'<br>pgsql.max_links: ' . ini_get('pgsql.max_links');

// setting one custom connection string for all objects
// (modify $connection_string to fit your needs)
$connection_string =
'host=localhost port=5432' .
' dbname=test user=test password=test';

// Creating 10 MyClassA objects using the same $connection_string
$objArr = Array();
for (
$i = 0; $i < 10; $i++)
$objArr[] = new MyClassA($connection_string);

// Human readable result:
foreach($objArr as $id => $object)
'%s: Object %s: using db %s<br>',
get_class($object), $id, $object->conn

/* ------------------------------------------------------------- */
// The result
// 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
/* ------------------------------------------------------------- */
// Each MyClassA object will use its _own_ database Resource id
raggaflo at libertysurf dot fr
22 years ago
Be careful when using Apache/PHP dynamic module/PostgreSQL :
in httpd.conf (Apache conf) default MaxClients is 150, whereas default PG's max_connections is 32 which is much fewer than 150. You have to set max_connections to at least MaxClients (and pg's shared_buffers to 2*max_connections at least) to avoid PG's errors with pg_pconnect like : "Sorry, too many clients already connected"
etsysx dot i dot hate dot spam at teleline dot es
22 years ago
To setup a high availability server with apache as a static module and postgreSQL, change httpd.conf and set MaxClients to less than max postgreSQL simultaneous connections (like 32 or 64).
This way pg_pconnect will allways return a valid handle under heavy traffic or under a request flow attack without wasting resources and without connection problems.
To Top