PHP Conference Japan 2024

db2_pconnect

(PECL ibm_db2 >= 1.0.0)

db2_pconnect 返回到数据库的持久连接

描述

db2_pconnect(
    字符串 $database,
    ?字符串 $username,
    ?字符串 $password,
    数组 $options = []
): 资源|false

返回到 IBM DB2 通用数据库、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 通用数据库支持。

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

i5_commit 属性应在 db2_pconnect() 之前设置。如果在连接建立后更改了该值,并且连接到远程数据源,则更改在连接句柄的下一个成功的 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
"显式受信任连接成功。\n";

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

//以用户 1 的身份执行一些操作。

//切换到受信任用户。
$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");
//以受信任用户的身份执行更多操作。

if($userBefore != $userAfter) {
echo
"用户已切换。" . "\n";
}
}

db2_close($tc_conn);
}
else {
echo
"显式受信任连接失败。\n";
}
?>

以上示例将输出

Explicit trusted connection succeeded.
User has been switched.

参见

添加注释

用户贡献的注释 2 条注释

1
satoruyoshida at php dot net
12 年前
如果您将在 IBMi 上创建 db2 连接,则 QSQSRVR 作业将在 QSYSWRK 子系统下以指定的用户名创建。
您可以使用 db2_pconnect() 函数确保这一点。

例如,db2_pconnect('*LOCAL', 'TESTUSR', 'PASSWORD') 将为我们带来具有 TESTUSR 用户的 QSQSRVR 作业。

如果您省略用户名,则作业中将使用 IHS 默认用户。
0
php at redlagoon dot net
6 年前

ibm_db2.ini 文件控制着许多与 pconnect 相关的属性。例如,可以配置过时连接的处理方式。
To Top