2024年PHP开发者大会(日本)

pg_pconnect

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

pg_pconnect打开一个持久化的PostgreSQL连接

描述

pg_pconnect(字符串 $connection_string, 整数 $flags = 0): PgSql\Connection|false

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

如果使用与现有连接相同的 connection_stringpg_pconnect() 进行第二次调用,则将返回现有连接,除非您将 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 条注释

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

摘要
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
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
Spiros Ioannou
21年前
与其减少apache中的MaxClients,不如尝试
将php中的pgsql.max_links减少到至少postmasters的数量。
它应该可以工作,并留下
更多可用的httpds用于静态html页面。
garrett at bgb dot cc
22年前
如果在页面处理结束时事务正在进行中,它会在连接放回池之前中止吗?或者连接是“按原样”添加的?

似乎正确的方法是在添加到池之前始终“ABORT”。

需要注意的是,这是一个检查连接在重新添加之前是否仍然打开的好时机。从而允许随着时间的推移清理关闭的连接,而不是像现在这样永远挂在那里。
dev.websafe.pl上的ts
17年前
<?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: 对象 %s: 使用数据库 %s<br>',
get_class($object), $id, $object->conn
);
}

/* ------------------------------------------------------------- */
// 结果
// pgsql.allow_persistent: 1
// pgsql.max_persistent: -1
// pgsql.max_links: -1
//
// MyClassA: 对象 0: 使用数据库 资源 ID #2
// MyClassA: 对象 1: 使用数据库 资源 ID #3
// MyClassA: 对象 2: 使用数据库 资源 ID #4
// MyClassA: 对象 3: 使用数据库 资源 ID #5
// MyClassA: 对象 4: 使用数据库 资源 ID #6
// MyClassA: 对象 5: 使用数据库 资源 ID #7
// MyClassA: 对象 6: 使用数据库 资源 ID #8
// MyClassA: 对象 7: 使用数据库 资源 ID #9
// MyClassA: 对象 8: 使用数据库 资源 ID #10
// MyClassA: 对象 9: 使用数据库 资源 ID #11
//
/* ------------------------------------------------------------- */
//
// 每个 MyClassA 对象都将使用其自己的数据库资源 ID
//
?>
libertysurf.fr上的raggaflo
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 时出现错误,例如:“抱歉,连接的客户端过多”
teleline.es上的etsysx.i.hate.spam
22年前
要使用 Apache 作为静态模块和 PostgreSQL 设置高可用性服务器,请更改 httpd.conf 并将 MaxClients 设置为小于 PostgreSQL 最大同时连接数(例如 32 或 64)。
这样,即使在高流量或请求洪流攻击下,pg_pconnect 也会始终返回有效的句柄,而不会浪费资源或出现连接问题。
To Top