PHP Conference Japan 2024

oci_close

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

oci_close关闭 Oracle 连接

描述

oci_close(资源 $connection): ?布尔值

取消设置 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( "连接在 %s 中断\n", date( "d-m-Y H:i:s" ) ) );
if( $conn ) {
OCIRollBack( $conn );
fwrite( $fp, sprintf( "-- 连接期间!ip=%s, 用户=%s, 页面=%s\n", $_SERVER["REMOTE_ADDR"], $_SERVER["PHP_AUTH_USER"], $_SERVER["SCRIPT_FILENAME"] ) );
}
fclose( $fp );
}
}

register_shutdown_function ( "close_db_locks_on_abort" );

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