oci_close
(PHP 5, PECL OCI8 >= 1.1.0)
oci_close — Закрывает соединение с сервером Oracle
Описание
$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($stid, OCI_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-выражением
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Расширения для работы с базами данных
- Расширения для работы с базами данных отдельных производителей
- Oracle OCI8
- oci_bind_array_by_name
- oci_bind_by_name
- oci_cancel
- oci_client_version
- oci_close
- oci_commit
- oci_connect
- oci_define_by_name
- oci_error
- oci_execute
- oci_fetch_all
- oci_fetch_array
- oci_fetch_assoc
- oci_fetch_object
- oci_fetch_row
- oci_fetch
- oci_field_is_null
- oci_field_name
- oci_field_precision
- oci_field_scale
- oci_field_size
- oci_field_type_raw
- oci_field_type
- oci_free_descriptor
- oci_free_statement
- oci_get_implicit_resultset
- oci_internal_debug
- oci_lob_copy
- oci_lob_is_equal
- oci_new_collection
- oci_new_connect
- oci_new_cursor
- oci_new_descriptor
- oci_num_fields
- oci_num_rows
- oci_parse
- oci_password_change
- oci_pconnect
- oci_result
- oci_rollback
- oci_server_version
- oci_set_action
- oci_set_client_identifier
- oci_set_client_info
- oci_set_edition
- oci_set_module_name
- oci_set_prefetch
- oci_statement_type
Коментарии
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.
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:
oci8.configuration#ini.oci8.persistent-timeout