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
(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)
oci_close — Cierra una conexión a Oracle
Desestablece connection
. La conexión subyacentte
a la base de datos se cierra si otros recursos no la están utilizando y si
fue creada con oci_connect()
o oci_new_connect().
Se recomienda cerrar las conexiones que no sean necesarias ya que esto hace que los recursos de la base de datos estén disponbles para otros usuarios.
connection
Un identificador de conexión de Oracle devuelto por oci_connect(), oci_pconnect() o oci_new_connect().
Devuelve true
en caso de éxito o false
en caso de error.
Ejemplo #1 Cerrar una conexión
Los recursos asociados con una conexión deberían cerrarse para asegurarse de que la conexión subyacente a la base de datos sea finalizada apropiadamente y sean liberados los recursos de la base de datos.
<?php
$conexión = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conexión) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
$stid = oci_parse($conexión, 'SELECT * FROM departments');
$r = oci_execute($stid);
oci_fetch_all($stid, $res);
var_dump($res);
// Liberar el identificador de sentencia al cerrar la conexión
oci_free_statement($stid);
oci_close($conexión);
?>
Ejemplo #2 Las conexiones a bases de datos no se cierran hasta que todas las referencias sean cerradas
La cuenta de referencias interna de un identificador de conexión debe ser cero antes de que sea cerrada la conexión subyacente a la base de datos.
<?php
$conexión = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conexión) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
$stid = oci_parse($conexión, 'SELECT * FROM departments'); // esto incrementa la cuenta de referencias de $conn
oci_execute($stid);
oci_fetch_all($stid, $res);
var_dump($res);
oci_close($conexión);
// $conexión ya no puede ser utilizada en el script, pero la conexión subyacente
// a la base de datos aún se mantiene abierta, hasta que $stid sea liberado.
var_dump($conexión); // imprime NULL
// Mientras PHP duerme, consultar la vista V$SESSION de Oracle en una
// ventana terminal mostrará que el ususario de la base de datos que aún está conectado.
sleep(10);
// Cuando $stid es liberado, la conexión a la base de datos se cierra físicamente
oci_free_statement($stid);
// Mientras PHP duerme, consultar la vista V$SESSION de Oracle en una
// ventana terminal mostrará que el ususario de la base de datos se ha desconectado.
sleep(10);
?>
Ejemplo #3 Cerrar una conexión abierta más de una vez
Cuando se reutilizan las credenciales de la base de datos, ambas conexiones deben cerrarse antes de que se cierre la conexión subyacente a la base de datos.
<?php
$conexión1 = oci_connect('hr', 'welcome', 'localhost/XE');
// Al usar las mismas credenciales se reutiliza la misma conexión subyacente a la base de datos
// Cualquier cambio no consignado realizado a $conexión1 será visible en $conexión2
$conexión2 = oci_connect('hr', 'welcome', 'localhost/XE');
// Mientras PHP duerme, consultar la vista V$SESSION de Oracle en una
// ventana terminal mostrará que solamente está conectado un ususario de la base de datos.
sleep(10);
oci_close($conexión1); // no cierra la conexión subyacente a la base de datos
var_dump($conexión1); // imprime NULL debido a que la variable $conexión1 ya no se puede utilizar
var_dump($conexión2); // muestra que $conexión2 aún es un recurso de conexión válido
?>
Ejemplo #4 Las conexsiones se cierran cuando las variables salen de su ámbito
Cuando todas las variables que hacen referencia a una conexión salen de su ámbito y son liberadas por PHP, se produce una reversión (rollback), si fuera necesaria, y la conexión subyacente a la base de datos se cierra.
<?php
function myfunc() {
$conexión = oci_connect('hr', 'hrpwd', 'localhost/XE');
if (!$conexión) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
$stid = oci_parse($conexión, 'UPDATE mytab SET id = 100');
oci_execute($stid, OCI_NO_AUTO_COMMIT);
return "Finalizado";
}
$r = myfunc();
// En este punto sucede la reversión y la conexión subyacente a la base de datos queda cerrada.
print $r; // muestra el valor de retorno "Finalizado" de la función.
?>
Nota:
Las variables que poseen una dependencia sobre el identificador de conexión, tales como los identificadores de sentencias devueltos por oci_parse(), también deben ser liberadas antes de cerra la conexión subyacente a la base de datos.
Nota:
Antes de la versión 5.1.2 de PHP (PECL OCI8 1.1) oci_close() no operaba. En versiones más recientes cierra correctamente la conexión a Oracle. Use la opción oci8.old_oci_close_semantics para restablecer el comportamento antiguo de esta función.
Nota:
La función oci_close() no cierra las conexiones subyacentes de la bases de datos creadas con oci_pconnect().
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
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.