oci_pconnect

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_pconnect使用持久连接连接到 Oracle 数据库

说明

oci_pconnect(
    string $username,
    string $password,
    ?string $connection_string = null,
    string $encoding = "",
    int $session_mode = OCI_DEFAULT
): resource|false

创建到 Oracle 服务器的持久连接并登录。

持久连接在请求之间被缓存和重复使用,从而减少了每次页面加载的开销;典型的 PHP 应用程序将对每个 Apache 子进程(或 PHP FPM 进程)在 Oracle 服务器上打开一个持久连接。有关更多信息,请参见 OCI8 连接处理和连接池 部分。

参数

username

Oracle 用户名。

password

username 的密码。

connection_string

包含要连接到的 Oracle 实例。它可以是 » Easy Connect 字符串,或 tnsnames.ora 文件中的连接名称,或本地 Oracle 实例的名称。

如果未指定或为 null,PHP 将使用环境变量(如 TWO_TASK(在 Linux 上)或 LOCAL(在 Windows 上)和 ORACLE_SID)来确定要连接到的 Oracle 实例

要使用 Easy Connect 命名方法,PHP 必须与 Oracle 10g 或更高版本的客户端库链接。Oracle 10g 的 Easy Connect 字符串的格式为:[//]host_name[:port][/service_name]。从 Oracle 11g 开始,语法为:[//]host_name[:port][/service_name][:server_type][/instance_name]。Oracle 19c 引入了更多选项,包括超时和保持活动设置。请参阅 Oracle 文档。可以在数据库服务器机器上运行 Oracle 实用程序 lsnrctl status 来查找服务名称。

tnsnames.ora 文件可以位于 Oracle Net 搜索路径中,其中包括 /your/path/to/instantclient/network/admin$ORACLE_HOME/network/admin/etc。或者设置 TNS_ADMIN,以便读取 $TNS_ADMIN/tnsnames.ora。确保 Web 守护程序具有对该文件的读取权限。

encoding

确定 Oracle 客户端库使用的字符集。字符集不需要与数据库使用的字符集匹配。如果不匹配,Oracle 将尽力将数据转换到数据库字符集和从数据库字符集转换。根据字符集,这可能无法提供可用的结果。转换还会增加一些时间开销。

如果没有指定,Oracle 客户端库将从 NLS_LANG 环境变量确定字符集。

传递此参数可以缩短连接所需的时间。

session_mode

此参数从 PHP 5(PECL OCI8 1.1)版本开始可用,并接受以下值:OCI_DEFAULTOCI_SYSOPEROCI_SYSDBA。如果指定了 OCI_SYSOPEROCI_SYSDBA,则此函数将尝试使用外部凭据建立特权连接。默认情况下,特权连接被禁用。要启用它们,您需要将 oci8.privileged_connect 设置为 On

PHP 5.3(PECL OCI8 1.3.4)引入了 OCI_CRED_EXT 模式值。这告诉 Oracle 使用外部或操作系统身份验证,这必须在数据库中配置。OCI_CRED_EXT 标志只能与用户名“/”和空密码一起使用。 oci8.privileged_connect 可以是 OnOff

OCI_CRED_EXT 可以与 OCI_SYSOPEROCI_SYSDBA 模式结合使用。

出于安全原因,OCI_CRED_EXT 在 Windows 上不受支持。

返回值

返回连接标识符或发生错误时返回 false

示例

示例 #1 使用 Easy Connect 语法的基本 oci_pconnect() 示例

<?php

// 连接到“localhost”机器上的 XE 服务(即数据库)
$conn = oci_pconnect('hr', 'welcome', 'localhost/XE');
if (!
$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'SELECT * FROM employees');
oci_execute($stid);

echo
"<table border='1'>\n";
while (
$row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
echo
"<tr>\n";
foreach (
$row as $item) {
echo
" <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : "&nbsp;") . "</td>\n";
}
echo
"</tr>\n";
}
echo
"</table>\n";

?>

有关参数使用情况的更多示例,请参见 oci_connect()

注释

注意: 每个 PHP 进程的持久 Oracle 连接的生存期和最大数量可以通过设置以下配置值来调整: oci8.persistent_timeoutoci8.ping_intervaloci8.max_persistent

参见

添加注释

用户贡献注释 2 个注释

2
php at jaggard dot org dot uk
15 年前
[编辑注:OCI8 1.3 不应该遇到此用户评论中描述的问题。首次使用此类连接将返回 Oracle 错误,这将触发 PHP 中的清理。随后的持久连接调用将成功。为了实现高可用性,您可能考虑在脚本中进行连续的 oci_pconnect 调用。]

如果您使用 oci_pconnect 连接,并且连接已将您注销但仍然有效,似乎没有办法重新使用该连接。下次我尝试 oci_pconnect 并执行 oci_execute 操作时,我收到“ORA-01012:未登录”警告。即使我使用 oci_close 关闭连接,此问题仍然存在。我最终使用了以下(相当烦人)的代码。

<?php
function getOracleConnection()
{
if (!
function_exists('oci_pconnect'))
return
false;
$toReturn = oci_pconnect('user', 'pass', 'db');
if (
$testRes = @oci_parse($toReturn, 'SELECT Count(group_type_code) FROM pvo.group_type'))
if (@
oci_execute($testRes))
if (@
oci_fetch_array($testRes))
return
$toReturn;
oci_close($toReturn);
if (!
function_exists('oci_connect'))
return
false;
$toReturn = oci_connect('user', 'pass', 'db');
if (
$testRes = @oci_parse($toReturn, 'SELECT Count(group_type_code) FROM pvo.group_type'))
if (@
oci_execute($testRes))
if (@
oci_fetch_array($testRes))
return
$toReturn;
oci_close($toReturn);
if (!
function_exists('oci_new_connect'))
return
false;
$toReturn = oci_new_connect('user', 'pass', 'db');
if (
$testRes = @oci_parse($toReturn, 'SELECT Count(group_type_code) FROM pvo.group_type'))
if (@
oci_execute($testRes))
if (@
oci_fetch_array($testRes))
return
$toReturn;
oci_close($toReturn);
return
false;
}
?>
0
gotankersley at NOSPAM dot com
12 年前
安装在 CentOS 6.2 上,并且在使其识别 tnsnames.ora 时遇到了很多麻烦。我的解决方法是

1. 确保 apache 通过将其放在 /etc/init.d/httpd 文件中来获取 TNS_ADMIN 环境变量
TNS_ADMIN=/usr/lib/oracle/11.2/client64/network/admin
export PATH TNS_ADMIN

这可以通过在 PHP 中进行调试来完成:<?php echo system('env'); ?>,并通过验证 TNS_ADMIN 是否存在。

2. 确保使用 tnsnames.ora 文件开头的名称 - 而不是 SID(虽然理想情况下它们应该匹配。但是,如果开头的名称是 XXXX.world,则 pconnect 将预期此名称 - 而不是 SID)
To Top