PHP 7.2.0 Release Candidate 4 Released

oci_close

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

oci_closeЗакрывает соединение с сервером Oracle

Описание

bool oci_close ( resource $connection )

Освобождает connection. Соответствующее ему соединение с базой данных будет закрыто при отсутствии использующих его ресурсов и если оно было получено из функции oci_connect() или oci_new_connect().

Рекомендуется закрывать неиспользуемые более соединения, т.к. это освобождает ресурсы базы данных для других пользователей.

Список параметров

connection

Идентификатор соединения Oracle, полученный из функций oci_connect(), oci_pconnect() или oci_new_connect().

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Примеры

Пример #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 Соединение базы данных не закрывается до тех пор, пока не будут закрыты все ссылки на него

Внутренний счетчик ссылок (refcount) идентификатора соединения должен равняться нулю перед непосредственным закрытием соединения к базе данных.

<?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');  // это увеличивает refcount на $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($stidOCI_NO_AUTO_COMMIT);
    return 
"Закончили!";
}

$r myfunc();
// В этой точке происходит откат транзакции и закрывается соответствующее
// соединение с базой данных

print $r;  // отображает возвращенное функцией значение "Закончили!"

?>

Примечания

Замечание:

Переменные, зависящие от идентификатора соединений, такие как идентификаторы выражений, полученные из oci_parse(), должны быть также освобождены до закрытия соединения с базой данных.

Замечание:

До версии PHP 5.1.2 (PECL OCI8 1.1) oci_close() не выполняла никаких действий. В более свежих версиях она уже корректно закрывает соединение. Используйте директиву oci8.old_oci_close_semantics для восстановления старого поведения этой функции.

Замечание:

Функция oci_close() не закрывает соединения с базой данных, созданные функцией oci_pconnect().

Смотрите также

  • oci_connect() - Устанавливает соединение с базой данных Oracle
  • oci_free_statement() - Освобождает ресурсы, занимаемые курсором или SQL-выражением

add a note add a note

User Contributed Notes 2 notes

up
1
Fahd Alwashmi (F-A-W)
5 years ago
please note, you can use oci_close() to close persistent connections opened with oci_pconnect() in PHP ver 5.3 or above.
as stated in here:
http://www.php.net/manual/en/oci8.configuration.php#ini.oci8.persistent-timeout
up
0
yepster at hotmail dot com
15 years ago
For using persistent connections && being able to sleep, I use:

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" );

This makes sure a rollback is done on a connection when a user hits 'stop', so there will be no locks on table rows.
To Top