oci_close

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

oci_close关闭 Oracle 连接

说明

oci_close(resource $connection): ?bool

取消设置 connection。如果没有任何其他资源使用它,并且它是使用 oci_connect()oci_new_connect() 创建的,则将关闭底层数据库连接。

建议关闭不再需要的连接,因为这会使数据库资源可供其他用户使用。

参数

connection

oci_connect()oci_pconnect()oci_new_connect() 返回的 Oracle 连接标识符。

返回值

oci8.old_oci_close_semantics 启用时,返回 null,否则返回 true

范例

示例 #1 关闭连接

与连接相关的资源应关闭,以确保底层数据库连接被正确终止,并且数据库资源被释放。

<?php

$conn
= oci_connect('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 departments');
$r = oci_execute($stid);
oci_fetch_all($stid, $res);
var_dump($res);

// 关闭连接时释放语句标识符
oci_free_statement($stid);
oci_close($conn);

?>

示例 #2 数据库连接在所有引用关闭之前不会关闭

连接标识符的内部引用计数必须为零,底层数据库连接才会关闭。

<?php

$conn
= oci_connect('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 departments'); // 这会增加 $conn 的引用计数
oci_execute($stid);
oci_fetch_all($stid, $res);
var_dump($res);

oci_close($conn);

// $conn 在脚本中不再可用,但底层数据库
// 连接仍保持打开状态,直到 $stid 被释放。
var_dump($conn); // 打印 NULL

// 当 PHP 休眠时,在终端窗口中查询 Oracle V$SESSION 视图将显示数据库用户仍然处于连接状态。
sleep(10);

// 当 $stid 被释放时,数据库连接将被物理关闭
oci_free_statement($stid);

// 当 PHP 休眠时,在终端窗口中查询 Oracle V$SESSION 视图将显示数据库用户已断开连接。
sleep(10);

?>

示例 #3 关闭多次打开的连接

当数据库凭据被重复使用时,必须关闭两个连接,底层数据库连接才会关闭。

<?php

$conn1
= oci_connect('hr', 'welcome', 'localhost/XE');

// 使用相同的凭据将重复使用相同的底层数据库连接
// 对 $conn1 做出的任何未提交更改将在 $conn2 中可见
$conn2 = oci_connect('hr', 'welcome', 'localhost/XE');

// 当 PHP 休眠时,在终端窗口中查询 Oracle V$SESSION 视图将显示只有一个数据库用户处于连接状态。
sleep(10);

oci_close($conn1); // 不会关闭底层数据库连接
var_dump($conn1); // 打印 NULL,因为变量 $conn1 不再可用
var_dump($conn2); // 显示 $conn2 仍然是有效的连接资源

?>

示例 #4 当变量超出范围时关闭连接

当所有引用连接的变量都超出范围并被 PHP 释放时,将发生回滚(如果需要),并且底层数据库连接将被关闭。

<?php

function myfunc() {
$conn = oci_connect('hr', 'hrpwd', 'localhost/XE');
if (!
$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'UPDATE mytab SET id = 100');
oci_execute($stid, OCI_NO_AUTO_COMMIT);
return
"Finished";
}

$r = myfunc();
// 在此,回滚操作已发生,基础数据库连接已释放。

print $r; // 显示函数返回值 "Finished"

?>

注释

注意:

依赖于连接标识符的变量(例如由 oci_parse() 返回的语句标识符)也必须在基础数据库连接关闭之前释放。

注意:

oci_close() 函数不会关闭使用 oci_pconnect() 创建的基础数据库连接。

另请参阅

添加注释

用户贡献的注释 2 个注释

Fahd Alwashmi (F-A-W)
12 年前
请注意,您可以在 PHP 5.3 或更高版本中使用 oci_close() 来关闭使用 oci_pconnect() 打开的持久连接。
如这里所述
https://php.net/manual/en/oci8.configuration.php#ini.oci8.persistent-timeout
yepster at hotmail dot com
22 年前
为了使用持久连接并能够休眠,我使用

function close_db_locks_on_abort( ) {
global $conn;
if( connection_aborted() ) {
$fp = fopen( "/tmp/shutdown-func.txt", "a" );
fwrite( $fp, sprintf( "connection aborted on %s\n", date( "d-m-Y H:i:s" ) ) );
if( $conn ) {
OCIRollBack( $conn );
fwrite( $fp, sprintf( "-- DURING CONNECTION! ip=%s, user=%s, page=%s\n", $_SERVER["REMOTE_ADDR"], $_SERVER["PHP_AUTH_USER"], $_SERVER["SCRIPT_FILENAME"] ) );
}
fclose( $fp );
}
}

register_shutdown_function ( "close_db_locks_on_abort" );

这确保在用户点击“停止”时对连接进行回滚,因此表行上不会有锁定。
To Top