PHP Unconference Europe 2015

oci_close

(PHP 5, PECL OCI8 >= 1.1.0)

oci_closeCierra una conexión a Oracle

Descripción

bool oci_close ( resource $connection )

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.

Parámetros

connection

Un identificador de conexión de Oracle devuelto por oci_connect(), oci_pconnect() o oci_new_connect().

Valores devueltos

Devuelve TRUE en caso de éxito o FALSE en caso de error.

Ejemplos

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($stidOCI_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.

?>

Notas

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().

Ver también

add a note add a note

User Contributed Notes 2 notes

up
0
Fahd Alwashmi (F-A-W)
2 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
12 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