2024 年 PHP 日本研討會

db2_pconnect

(PECL ibm_db2 >= 1.0.0)

db2_pconnect 傳回與資料庫的持續性連線

說明

db2_pconnect(
    字串 $database,
    ?字串 $username,
    ?字串 $password,
    陣列 $options = []
): 資源|false

傳回與 IBM DB2 Universal Database、IBM Cloudscape 或 Apache Derby 資料庫的持續性連線。

關於持續性連線的更多資訊,請參考 持續性資料庫連線

在持續連線上呼叫 db2_close() 永遠會返回 true,但底層的 DB2 用戶端連線會保持開啟狀態,並等待服務下一個符合的 db2_pconnect() 請求。

使用 ibm_db2 1.9.0 或更高版本的使用者應該注意,擴充功能會在請求結束時對持續連線執行交易回滾,從而結束交易。這可以防止交易區塊在腳本執行結束於交易區塊之前,延續到下一個使用該連線的請求。

參數

database(資料庫)

對於已編錄到資料庫的連線,database 代表 DB2 用戶端目錄中的資料庫別名。

對於未編錄到資料庫的連線,database 代表以下格式的完整連線字串

DATABASE=database;HOSTNAME=hostname;PORT=port;PROTOCOL=TCPIP;UID=username;PWD=password;

注意事項:

連線到 IBM i 上的 Db2 時,底層系統會呼叫 » SQLDriverConnect,它只接受 DSN、UID 和 PWD 作為 » 連線字串。如下所示

DSN=database;UID=username;PWD=password;

其中參數代表以下值
database(資料庫)

資料庫的名稱。

hostname(主機名稱)

資料庫伺服器的主機名稱或 IP 位址。

port(連接埠)

資料庫在其上偵聽請求的 TCP/IP 連接埠。

username(使用者名稱)

用於連線到資料庫的使用者名稱。

password(密碼)

用於連線到資料庫的密碼。

username(使用者名稱)

用於連線到資料庫的使用者名稱。

password(密碼)

用於連線到資料庫的密碼。

options(選項)

一個包含影響連線行為的連線選項的關聯式陣列,其中有效的陣列鍵包含

autocommit(自動提交)

傳遞 DB2_AUTOCOMMIT_ON 值會為此連線控制代碼開啟自動提交。

傳遞 DB2_AUTOCOMMIT_OFF 值會為此連線控制代碼關閉自動提交。

DB2_ATTR_CASE

傳遞 DB2_CASE_NATURAL 值指定以自然大小寫返回欄位名稱。

傳遞 DB2_CASE_LOWER 值指定以小寫返回欄位名稱。

傳遞 DB2_CASE_UPPER 值指定以大寫返回欄位名稱。

CURSOR(游標)

傳遞 DB2_FORWARD_ONLY 值指定陳述式資源的僅向前游標。這是預設的游標類型,所有資料庫伺服器都支援。

傳遞 DB2_SCROLLABLE 值指定陳述式資源的可捲動游標。此模式允許隨機存取結果集中的列,但目前僅 IBM DB2 Universal Database 支援。

ibm_db2 1.7.0 及更高版本提供以下新選項。

trustedcontext(信任的環境)

傳遞 DB2_TRUSTED_CONTEXT_ENABLE 值會為此連線控制代碼開啟信任的環境。此參數無法使用 db2_set_option() 設定。

只有在資料庫已編錄(即使資料庫是本機的),或者在建立連線時指定完整的 DSN 時,此鍵才有效。

要編錄資料庫,請使用以下指令

db2 catalog tcpip node loopback remote <SERVERNAME> server <SERVICENAME>
db2 catalog database <LOCALDBNAME> as <REMOTEDBNAME> at node loopback
db2 "update dbm cfg using svcename <SERVICENAME>"
db2set DB2COMM=TCPIP

ibm_db2 1.5.1 及更高版本提供以下新的 i5/OS 選項。

提示

與持續連線一起使用的衝突連線屬性會在 i5/OS 上產生不確定的結果。應該為使用每個持續連線使用者設定檔的所有應用程式建立站點策略。建議在使用持續連線時使用預設的 DB2_AUTOCOMMIT_ON。

i5_lib

一個字元值,指示將用於解析非限定檔案參考的預設程式庫。如果連線使用系統命名模式,則此值無效。

i5_naming

設定值 DB2_I5_NAMING_ON 會開啟 DB2 UDB CLI iSeries 系統命名模式。檔案會使用斜線 (/) 作為定界字元。未限定名稱的檔案會使用作業的程式庫清單來解析。

設定值 DB2_I5_NAMING_OFF 會關閉 DB2 UDB CLI 預設的命名模式,也就是 SQL 命名模式。檔案會使用句點 (.) 作為定界字元。未限定名稱的檔案會使用預設程式庫或目前使用者 ID 來解析。

i5_commit

應該在呼叫 db2_pconnect() 之前設定 i5_commit 屬性。如果在建立連線後變更此值,且連線指向遠端資料來源,則變更將在下一次成功呼叫 db2_pconnect() 該連線控點時才會生效。

注意事項:

php.ini 設定 ibm_db2.i5_allow_commit==0 或 DB2_I5_TXN_NO_COMMIT 為預設值,但可以使用 i5_commit 選項覆寫。

DB2_I5_TXN_NO_COMMIT - 不使用提交控制。

DB2_I5_TXN_READ_UNCOMMITTED - 可能發生未提交讀取、不可重複讀取和幻讀。

DB2_I5_TXN_READ_COMMITTED - 不可能發生未提交讀取。可能發生不可重複讀取和幻讀。

DB2_I5_TXN_REPEATABLE_READ - 不可能發生未提交讀取和不可重複讀取。可能發生幻讀。

DB2_I5_TXN_SERIALIZABLE - 交易是可序列化的。不可能發生未提交讀取、不可重複讀取和幻讀。

i5_query_optimize

DB2_FIRST_IO 所有查詢都以盡快返回第一頁輸出為目標進行最佳化。當輸出由使用者控制,且使用者很可能在檢視第一頁輸出數據後取消查詢時,此目標效果良好。使用 OPTIMIZE FOR nnn ROWS 子句編碼的查詢會遵循子句指定的目標。

DB2_ALL_IO 所有查詢都以在最短的經過時間內完成整個查詢為目標進行最佳化。當查詢的輸出被寫入檔案或報告,或介面正在將輸出數據排入佇列時,這是一個不錯的選項。使用 OPTIMIZE FOR nnn ROWS 子句編碼的查詢會遵循子句指定的目標。這是預設值。

i5_dbcs_alloc

DB2_I5_DBCS_ALLOC_ON 值會開啟 DB2 6X 配置方案,以因應 DBCS 轉換欄位大小的增長。

DB2_I5_DBCS_ALLOC_OFF 值會關閉 DB2 6X 配置方案,以因應 DBCS 轉換欄位大小的增長。

注意事項:

php.ini 設定 ibm_db2.i5_dbcs_alloc==0 或 DB2_I5_DBCS_ALLOC_OFF 為預設值,但可以使用 i5_dbcs_alloc 選項覆寫。

i5_date_fmt

DB2_I5_FMT_ISO - 使用國際標準化組織 (ISO) 日期格式 yyyy-mm-dd。這是預設值。

DB2_I5_FMT_USA - 使用美國日期格式 mm/dd/yyyy。

DB2_I5_FMT_EUR - 使用歐洲日期格式 dd.mm.yyyy。

DB2_I5_FMT_JIS - 使用日本工業標準日期格式 yyyy-mm-dd。

DB2_I5_FMT_MDY - 使用日期格式 mm/dd/yyyy。

DB2_I5_FMT_DMY - 使用日期格式 dd/mm/yyyy。

DB2_I5_FMT_YMD - 使用日期格式 yy/mm/dd。

DB2_I5_FMT_JUL - 使用儒略日期格式 yy/ddd。

DB2_I5_FMT_JOB - 使用作業預設值。

i5_date_sep

DB2_I5_SEP_SLASH - 使用斜線 ( / ) 作為日期分隔符號。這是預設值。

DB2_I5_SEP_DASH - 使用破折號 ( - ) 作為日期分隔符號。

DB2_I5_SEP_PERIOD - 使用句點 ( . ) 作為日期分隔符號。

DB2_I5_SEP_COMMA - 使用逗號 ( , ) 作為日期分隔符號。

DB2_I5_SEP_BLANK - 使用空格作為日期分隔符號。

DB2_I5_SEP_JOB - 使用作業預設值。

i5_time_fmt

DB2_I5_FMT_ISO - 使用國際標準化組織 (ISO) 時間格式 hh.mm.ss。這是預設值。

DB2_I5_FMT_USA - 使用美國時間格式 hh:mmxx,其中 xx 為 AM 或 PM。

DB2_I5_FMT_EUR - 使用歐洲時間格式 hh.mm.ss。

DB2_I5_FMT_JIS - 使用日本工業標準時間格式 hh:mm:ss。

DB2_I5_FMT_HMS - 使用 hh:mm:ss 格式。

i5_time_sep

DB2_I5_SEP_COLON - 使用冒號 ( : ) 作為時間分隔符號。這是預設值。

DB2_I5_SEP_PERIOD - 使用句點 ( . ) 作為時間分隔符號。

DB2_I5_SEP_COMMA - 使用逗號 ( , ) 作為時間分隔符號。

DB2_I5_SEP_BLANK - 使用空格作為時間分隔符號。

DB2_I5_SEP_JOB - 使用作業預設值。

i5_decimal_sep

DB2_I5_SEP_PERIOD - 使用句點 ( . ) 作為小數點分隔符號。這是預設值。

DB2_I5_SEP_COMMA - 使用逗號 ( , ) 作為小數點分隔符號。

DB2_I5_SEP_JOB - 使用作業預設值。

以下新的 i5/OS 選項在 ibm_db2 1.8.0 版及之後的版本中可用。

i5_libl

一個字元值,指示用於解析非限定檔案參考的程式庫清單。以空格分隔程式庫清單元素,例如 'i5_libl'=>"MYLIB YOURLIB ANYLIB"。

注意事項:

i5_libl 會呼叫 qsys2/qcmdexc('cmd',cmdlen),此功能僅在 i5/OS V5R4 及之後的版本中可用。

傳回值

如果連線嘗試成功,則傳回連線控制代碼資源。db2_pconnect() 會嘗試重複使用與 databaseusernamepassword 參數完全相符的現有連線資源。如果連線嘗試失敗,db2_pconnect() 會傳回 false

更新日誌

版本 說明
PECL ibm_db2 1.9.0 持續連線中的作用中交易將在每個請求結束時回復。
PECL ibm_db2 1.8.0 i5/OS 使用者可以使用 i5_libl 選項。
PECL ibm_db2 1.7.0 可以使用 trustedcontext 選項。
PECL ibm_db2 1.5.1 i5/OS 使用者可以使用 i5_libi5_namingi5_commiti5_query_optimizei5_dbcs_alloci5_date_fmti5_date_sepi5_time_fmti5_time_sepi5_decimal_sep 選項。

範例

範例 #1 db2_pconnect() 範例

在以下範例中,第一次呼叫 db2_pconnect() 會傳回新的持續連線資源。第二次呼叫 db2_pconnect() 會傳回一個持續連線資源,該資源只是重複使用第一個持續連線資源。

<?php
$database
= 'SAMPLE';
$user = 'db2inst1';
$password = 'ibmdb2';

$pconn = db2_pconnect($database, $user, $password);

if (
$pconn) {
echo
"持續連線成功。";
}
else {
echo
"持續連線失敗。";
}

$pconn2 = db2_pconnect($database, $user, $password);
if (
$pconn) {
echo
"第二次持續連線成功。";
}
else {
echo
"第二次持續連線失敗。";
}
?>

以上範例將輸出

Persistent connection succeeded.
Second persistent connection succeeded.

範例 #2 使用信任的環境

以下範例顯示如何啟用信任的環境、切換使用者和取得目前的使用者 ID。

<?php

$database
= "SAMPLE";
$hostname = "localhost";
$port = 50000;
$authID = "db2inst1";
$auth_pass = "ibmdb2";

$tc_user = "tcuser";
$tc_pass = "tcpassword";

$dsn = "DATABASE=$database;HOSTNAME=$hostname;PORT=$port;
PROTOCOL=TCPIP;UID=
$authID;PWD=$auth_pass;";
$options = array ("trustedcontext" => DB2_TRUSTED_CONTEXT_ENABLE);

$tc_conn = db2_pconnect($dsn, "", "", $options);
if(
$tc_conn) {
echo
"Explicit trusted connection succeeded.\n";

if(
db2_get_option($tc_conn, "trustedcontext")) {
$userBefore = db2_get_option($tc_conn, "trusted_user");

//Do some work as user 1.

//Switching to trusted user.
$parameters = array("trusted_user" => $tc_user,
"trusted_password" => $tcuser_pass);
$res = db2_set_option ($tc_conn, $parameters, 1);

$userAfter = db2_get_option($tc_conn, "trusted_user");
//Do more work as trusted user.

if($userBefore != $userAfter) {
echo
"User has been switched." . "\n";
}
}

db2_close($tc_conn);
}
else {
echo
"Explicit trusted connection failed.\n";
}
?>

以上範例將輸出

Explicit trusted connection succeeded.
User has been switched.

另請參閱

新增註解

使用者貢獻的註解 2 則註解

satoruyoshida at php dot net
12 年前
如果您要在 IBMi 上建立 db2 連線,QSQSRVR 作業將會以指定的使用者在 QSYSWRK 子系統下建立。
您可以使用 db2_pconnect() 函式來確保這一點。

例如,db2_pconnect('*LOCAL', 'TESTUSR', 'PASSWORD') 將會以 TESTUSR 使用者建立 QSQSRVR 作業。

如果您省略使用者,則作業中會使用 IHS 預設使用者。
php at redlagoon dot net
6 年前
ibm_db2.ini 檔案控制許多與 pconnect 相關的屬性。例如,可以設定過期連線的處理方式。
To Top