PHP 日本研討會 2024

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 資料庫的連線。它會傳回其他 PostgreSQL 函式所需的 PgSql\Connection 實例。

如果第二次以與現有連線相同的 connection_string 呼叫 pg_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 條註解

0
Dennis Fogg
17 年前
截至 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 年前
您可以嘗試減少 php 中的 pgsql.max_links,而不是減少 apache 中的 MaxClients,
至少要達到 postmasters 的數量。
它應該可以運作,並讓
您有更多可用的 httpd 用於靜態 html 頁面。
-2
garrett at bgb dot cc
22 年前
當頁面處理結束時,如果交易正在進行中,是否會在連線放回集區之前中止?或者連線是否「照原樣」新增?

看起來正確的做法是在新增到集區之前總是執行「ABORT」。

請注意,這會是檢查連線是否仍然開啟,然後再重新加入的好時機。這樣就可以隨著時間清理關閉的連線,而不是像現在這樣永遠閒置。
-3
ts at dev dot websafe dot pl
17 年前
<?php
//
// 在類別中使用 pg_pconnect。
//
// 為何要這樣做?因為手冊上說:
//
// 如果第二次呼叫 pg_pconnect() 時使用了與現有連線相同的
// connection_string,除非您傳遞
// 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
//
?>
-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 時出現錯誤,例如:「抱歉,已連線的用戶端過多」。
-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