PHP Conference Japan 2024

pg_connect

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

pg_connect開啟 PostgreSQL 連線

說明

pg_connect(字串 $connection_string, 整數 $flags = 0): PgSql\Connection|false

pg_connect() 開啟一個由 connection_string 指定的 PostgreSQL 資料庫連線。

如果使用與現有連線相同的 connection_string 第二次呼叫 pg_connect(),將會返回現有連線,除非您傳遞 PGSQL_CONNECT_FORCE_NEW 作為 flags

使用多個參數的舊語法 $conn = pg_connect("host", "port", "options", "tty", "dbname") 已被棄用。

參數

connection_string

connection_string 可以為空以使用所有預設參數,或者它可以包含一個或多個以空白分隔的參數設定。每個參數設定的形式為 keyword = value。等號周圍的空格是可選的。若要寫入空值或包含空格的值,請用單引號括住它,例如 keyword = 'a value'。值內的單引號和反斜線必須使用反斜線跳脫,即 \' 和 \\。

目前可辨識的參數關鍵字有:hosthostaddrportdbname(預設為 user 的值)、userpasswordconnect_timeoutoptionstty(已忽略)、sslmoderequiressl(已棄用,改用 sslmode)和 service。這些參數是否存在取決於您的 PostgreSQL 版本。

options 參數可用於設定要由伺服器調用的命令列參數。

flags

如果傳遞 PGSQL_CONNECT_FORCE_NEW,則會建立新的連線,即使 connection_string 與現有連線相同。

如果給定 PGSQL_CONNECT_ASYNC,則會以非同步方式建立連線。然後可以透過 pg_connect_poll()pg_connection_status() 檢查連線的狀態。

回傳值

成功時返回 PgSql\Connection 實例,失敗時返回 false

更新日誌

版本 說明
8.1.0 現在返回 PgSql\Connection 實例;以前,返回的是一個 資源

範例

範例 1 使用 pg_connect()

<?php
$dbconn
= pg_connect("dbname=mary");
// 連接到一個名為 "mary" 的資料庫

$dbconn2 = pg_connect("host=localhost port=5432 dbname=mary");
// 連接到 "localhost" 上連接埠 "5432" 的名為 "mary" 的資料庫

$dbconn3 = pg_connect("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_connect($conn_string);
// 以使用者名稱和密碼連線到主機 "sheep" 上名為 "test" 的資料庫

$dbconn5 = pg_connect("host=localhost options='--client_encoding=UTF8'");
// 連接到 "localhost" 上的資料庫,並設定命令列參數,告知編碼為 UTF-8
?>

參見

新增註記

使用者貢獻的註記 19 個註記

13
lukasz dot wolczak at gmail dot com
8 年前
值得知道的是,您可以在連線字串中設定 application_name,請考慮這個簡單的範例

<?php
$appName
= $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$connStr = "host=localhost port=5432 dbname=postgres user=postgres options='--application_name=$appName'";

// 簡單檢查
$conn = pg_connect($connStr);
$result = pg_query($conn, "select * from pg_stat_activity");
var_dump(pg_fetch_all($result));

?>

透過在 cli 或 cgi 上執行此操作,您可以在 pgAdmin 中看到哪些腳本正在執行,或哪些請求正在資料庫上執行。您可以擴充 postgres 的組態,以追蹤慢查詢並將應用程式名稱列印到日誌中。這對我來說非常有用,可以找出我應該優化什麼以及在哪裡優化。
6
Dave
11 年前
如果您使用 pgbouncer 和 unix socket
且您的 pgbouncer.ini 看起來像這樣
listen_port = 6432
unix_socket_dir = /tmp

您可以這樣連接

pg_connect('host=/tmp port=6432 dbname=DB user=USER password=PASS');
4
匿名
10 年前
由於缺乏文件,取得 md5 密碼令人困惑

- 設定您的 pg_hba.conf 以便使用 md5 密碼而不是 'trust' 或 'ident'
- 檢查您的 postgres.conf 是否有 'password_encryption=on'(根據版本,這可能已經是 'on')。
- 請務必重新啟動您的 postgres 程序。
- 在 PHP 中,你只需要提供 _純文字_ 的使用者名稱和密碼
'host=localhost port=5432 dbname=megadb user=megauser password=holyhandbagsbatmanthispasswordisinplaintext'
Postgres 的 PHP 函式庫會自動幫你做 md5 編碼,你不需要自己做。
4
bgalloway at citycarshare dot org
16 年前
請注意不要寫成這樣:
<?php
function getdb_FAILS() {
return
pg_connect("...") or die('connection failed');
}
?>

它會回傳一個布林值。如果你不將回傳值當作資料庫連線控制代碼使用,這看起來沒問題,但如果你這樣做,就會失敗。

請改用:
<?php
function getdb() {
$db = pg_connect("...") or die('connection failed');
return
$db;
}
?>

它才會實際回傳一個控制代碼。
2
tim at buttersideup dot com
16 年前
這裡沒有明確說明,但你也可以透過 UNIX 網域套接字連接 PostgreSQL,只需將 host 留空即可。這應該比使用 TCP 的開銷更少,例如:

$dbh = new PDO('pgsql:user=exampleuser dbname=exampledb password=examplepass');

事實上,由於 C 函式庫呼叫 PQconnectdb 是這個實作的基礎,你可以提供這個函式庫呼叫會接受的任何東西 - "pgsql:" 前綴會在呼叫 PQconnectdb 之前被移除,如果你提供任何可選參數 (例如 user),這些參數會被加到你提供的字串中... 請查看你相關的 PostgreSQL 客戶端函式庫的文件,例如:

https://postgresql.dev.org.tw/docs/8.3/static/libpq-connect.html

如果你真的想用,你可以用 ';' 來分隔你的參數 - 這些會在呼叫 PQconnectdb 之前被轉換成空格。

Tim.
2
thakur at corexprts dot com
14 年前
有一件事要記住,當嘗試使用 pg_connect 時,請加入 timeout 參數。

<?php
$d
=pg_connect('host=example.com user=pgsql dbname=postgres connect_timeout=5');
?>
1
matias at nospam dot projectcast dot com
22 年前
至少在 Postgres 7.2 中,連接到本機 postgres 資料庫需要在資料庫中有一個與執行 Apache 的使用者名稱相同的使用者,否則連線會失敗。
0
VLroyrenn
5 年前
為了方便起見,應該注意的是,雖然 PHP 通常會為您處理連線重複使用,只要您持續使用相同的連線字串,如下例所示:

<?php
$before_conn1
= microtime(true);
$db1 = pg_connect($conn_string);

$before_conn2 = microtime(true);
$db2 = pg_connect($conn_string);
$after_conn2 = microtime(true);

echo(
$before_conn2 - $before_conn1); // 花費約 0.03 秒
echo("\n");
echo(
$after_conn2 - $before_conn2); // 花費 0 秒
?>

...雖然這很不錯,但不適用於非同步連線;您必須自行管理這些連線,而且您不能稍後將非同步連線接續為同步連線,作為一種在傳送查詢之前等待連線程序完成的簡單方法。

<?php
$before_conn1
= microtime(true);
$db1 = pg_connect($conn_string, PGSQL_CONNECT_ASYNC);
sleep(1);

$before_conn2 = microtime(true);
$db2 = pg_connect($conn_string);
$after_conn2 = microtime(true);

echo(
$before_conn2 - $before_conn1); // 花費約 1 秒
echo("\n");
echo(
$after_conn2 - $before_conn2); // 花費約 0.025 秒
?>
-1
Anonymous
19 年前
pg_connect 的 sslmode 參數接受的值為:disable、allow、prefer、require
-1
gutostraube at gmail dot com
15 年前
可以使用 pg_connect() 函式,透過 Unix socket 連接到 PostgreSQL 資料庫,方法如下兩種:

1) 使用 socket 路徑

<?php
$conn
= pg_connect('host=/var/run/postgresql user=username dbname=databasename');
?>

2) 省略主機名稱/路徑

<?php
$conn
= pg_connect('user=username dbname=databasename');
?>

注意:在這種情況下(省略 host 值),將會使用預設的 socket 路徑。
-2
leace at post dot cz
24 年前
如果您使用 PostgreSQL 使用者來驗證您的 pg 資料庫,而不是使用您自己的驗證,請務必在 pg_connect 中指定 host 指令,並編輯 pg_hba.conf 以便從該 host 進行相應的驗證。否則,PHP 將使用 UNIX 網域套接字以 'local' 連接,這在 pg_hba.conf 中預設設定為 'trust' (所以您可以在控制台上使用 psql 連接而無需指定密碼),而且每個人都可以_無需密碼_連接到資料庫。
-2
phpnet at benjamin dot schulz dot name
20 年前
如果您需要開啟一個新的連線控制代碼(例如用於多個 pg_send_query()),請使用 PGSQL_CONNECT_FORCE_NEW 作為 pg_connect() 的第二個參數。
-2
floriparob at gmail dot com
8 年前
將 "service" 參數當作連線字串使用時,我們發現以下函式:-

putenv("PGSERVICEFILE=/path/to/your/service/file/pg_service.conf");
$connect_string = ("service=testdb");
try {
$pgconn_handle = pg_connect($connect_string);
. . . . . 等。

注意:-
1) 環境變數必須指向路徑和檔案名稱。
2) 該檔案必須可以讓 Apache 讀取。

請參閱:-

https://postgresql.dev.org.tw/docs/9.6/static/libpq-pgservice.html

瞭解如何建立您的 pg_service.conf
-3
Sohel Taslim
17 年前
我遇到了同樣的問題,但我必須用不同的方式解決它。
在我的 postgresql.conf 檔案中,以下內容被註解掉了。
因此,我啟用了「連線設定」下的以下設定:-

# - 連線設定 –
tcpip_socket = true
-2
xzilla at users dot sourceforge dot net
20 年前
關於 matias at nospam dot projectcast dot com 的註解
在 2002 年 2 月 12 日 01:16,您不需要在資料庫中有一個與您的網頁使用者名稱相同的使用者,在任何版本的 postgresql 中都不需要。唯一需要這樣做的情況是,如果您將您的 postgresql 伺服器設定為只允許基於 IDENT 的驗證(我記得,這是 Red Hat 系統的預設設定,這可能導致了混淆)。有關 postgresql 允許的各種驗證方法的更多資訊,請查看 https://postgresql.dev.org.tw/docs/7.4/static/client-authentication.html
-2
jtate at php dot net
21 年前
如果您在連接 7.1 或更新版本的 PostgreSQL 資料庫時,在您的 pg_connect 字串中使用 host=HOSTNAME,您需要確保您的 postmaster daemon 以 "-i" 選項啟動。否則連線將會失敗。請參閱 https://postgresql.dev.org.tw/idocs/index.php?client-authentication.html 以取得客戶端驗證文件。
-3
kayotix at yahoo dot com
24 年前
安裝中埋藏著一個小提示。在 Php 3 中,PostgreSQL 支援是透過在傳遞給 ./configure 的選項中新增 --with-postgresql=[DIR] 來啟用的。在 Php 4.0.2(在 Linux 上)中,參數是 --with-pgsql。我發現這個資訊的唯一地方是在手冊中安裝 PHP on Unix 的部分。
-3
rolf at sir-wum dot de
23 年前
pg_connect() 無法使用 pg_hba.conf 中的 'crypt' 驗證方法。我花了一個小時才弄清楚,直到我記起 Windows 缺少 crypt() 呼叫的一些其他問題。
-5
derry at siliconriver.com dot au
21 年前
pg_connect 似乎支援 SSL 連線,在 Postgres 已使用 ssl 編譯的系統上,我假設這是因為 psql 使用 libpq 進行連線。
pg_connect 可以成功連線並使用 "requiressl" 參數。
To Top