oci_pconnect

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

oci_pconnectEstablece una conexión persistente a un servidor Oracle

Descripción

oci_pconnect(
    string $username,
    string $password,
    ?string $connection_string = null,
    string $encoding = "",
    int $session_mode = OCI_DEFAULT
): resource|false

Establece una conexión persistente a un servidor Oracle y se identifica.

Las conexiones persistentes se almacenan en caché y se reutilizan entre las consultas, reduciendo así la carga en cada carga de página; una aplicación PHP típica tiene una sola conexión persistente a un servidor Oracle por proceso hijo Apache (o proceso PHP FastCGI/CGI). Ver la sección sobre la Gestión de Conexiones y el Agrupamiento de Conexiones para más información.

Parámetros

username

El nombre de usuario de Oracle.

password

La contraseña del usuario.

connection_string

Contiene la instancia Oracle a la que debemos conectarnos. Esto puede ser una » cadena de conexión rápida, un nombre de conexión del archivo tnsnames.ora, o el nombre de una instancia local Oracle.

Si no se especifica o es null, PHP utiliza variables de entorno como TWO_TASK (en Linux) o LOCAL (en Windows) y ORACLE_SID para determinar la instancia Oracle a la que debemos conectarnos.

Para usar el método de conexión rápida, PHP debe estar vinculado con la biblioteca cliente Oracle 10g o superior. La cadena de conexión rápida para Oracle 10g o superior es de la forma : [//]host_name[:port][/service_name]. Desde Oracle 11g, la sintaxis es : [//]host_name[:port][/service_name][:server_type][/instance_name]. Opciones adicionales fueron introducidas con Oracle 19c Los nombres de los servicios pueden ser encontrados ejecutando la utilidad Oracle lsnrctl status en la máquina que ejecuta la base de datos.

El archivo tnsnames.ora puede estar en el camino de búsqueda de Oracle Net, que incluye /your/path/to/instantclient/network/admin, $ORACLE_HOME/network/admin y /etc. Una solución alternativa sería definir TNS_ADMIN para que el archivo $TNS_ADMIN/tnsnames.ora sea leído. Asegúrese de que el demonio que ejecuta el servidor web tenga acceso de lectura a este archivo.

encoding

Determina el juego de caracteres utilizado por la biblioteca cliente Oracle. El juego de caracteres no necesita ser idéntico al utilizado por la base de datos. Si no coincide, Oracle hará lo mejor posible para convertir los datos desde el juego de caracteres de la base de datos. Dependiendo de los juegos de caracteres, el resultado puede no ser perfecto. Además, esta conversión requiere un poco de tiempo del sistema.

Si no se especifica, la biblioteca cliente Oracle determinará un juego de caracteres desde la variable de entorno NLS_LANG.

Pasar este parámetro puede reducir el tiempo de conexión.

session_mode

Este parámetro está disponible a partir de PHP 5 (PECL OCI8 1.1) y acepta los siguientes valores : OCI_DEFAULT, OCI_SYSOPER y OCI_SYSDBA. Si bien la constante OCI_SYSOPER o la constante OCI_SYSDBA es especificada, esta función intentará establecer una conexión privilegiada usando identidades externas. Las conexiones privilegiadas están desactivadas por omisión. Para activarlas, debe definir la opción oci8.privileged_connect a On.

PHP 5.3 (PECL OCI8 1.3.4) introducen el valor de modo OCI_CRED_EXT. Este modo solicita a Oracle usar una identificación externa o bien del sistema operativo, que debe ser configurada en la base de datos. El flag OCI_CRED_EXT solo puede ser usado con el nombre de usuario "/" asociado a una contraseña vacía. La opción oci8.privileged_connect puede ser definida a On o Off.

OCI_CRED_EXT puede ser combinado con el modo OCI_SYSOPER o el modo OCI_SYSDBA.

OCI_CRED_EXT no es soportado en Windows por razones de seguridad.

Valores devueltos

Devuelve un identificador de conexión, o false si ocurre un error.

Ejemplos

Ejemplo #1 Ejemplo con oci_pconnect()

<?php

// Conexión al servicio XE (i.e. base de datos) en la máquina "localhost"
$conn = oci_pconnect('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 employees');
oci_execute($stid);

echo
"<table border='1'>\n";
while (
$row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
echo
"<tr>\n";
foreach (
$row as $item) {
echo
" <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : "") . "</td>\n";
}
echo
"</tr>\n";
}
echo
"</table>\n";

?>

Ver la función oci_connect() para más ejemplos sobre el uso de este parámetro.

Notas

Nota: La duración y el número máximo de conexiones persistentes Oracle por proceso PHP pueden ajustarse definiendo los siguientes valores de configuración: oci8.persistent_timeout, oci8.ping_interval y oci8.max_persistent.

Ver también

add a note

User Contributed Notes 2 notes

up
2
php at jaggard dot org dot uk
16 years ago
[Editor's note: OCI8 1.3 should not experience the problem described in this user comment. The first use of such a connection will return an Oracle error which will trigger a cleanup in PHP. Subsequent persistent connection calls will then succeed. For high availability you might consider doing consecutive oci_pconnect calls in your script.]

If you connect using oci_pconnect and the connection has logged you off but is still valid, there seems to be no way to re-use that connection. The next time I try oci_pconnect and then perform an oci_execute operation, I get a "ORA-01012: not logged on" warning. This problem remains, even if I close the connection using oci_close. I ended up with the following (rather annoying) code.

<?php
function getOracleConnection()
{
if (!
function_exists('oci_pconnect'))
return
false;
$toReturn = oci_pconnect('user', 'pass', 'db');
if (
$testRes = @oci_parse($toReturn, 'SELECT Count(group_type_code) FROM pvo.group_type'))
if (@
oci_execute($testRes))
if (@
oci_fetch_array($testRes))
return
$toReturn;
oci_close($toReturn);
if (!
function_exists('oci_connect'))
return
false;
$toReturn = oci_connect('user', 'pass', 'db');
if (
$testRes = @oci_parse($toReturn, 'SELECT Count(group_type_code) FROM pvo.group_type'))
if (@
oci_execute($testRes))
if (@
oci_fetch_array($testRes))
return
$toReturn;
oci_close($toReturn);
if (!
function_exists('oci_new_connect'))
return
false;
$toReturn = oci_new_connect('user', 'pass', 'db');
if (
$testRes = @oci_parse($toReturn, 'SELECT Count(group_type_code) FROM pvo.group_type'))
if (@
oci_execute($testRes))
if (@
oci_fetch_array($testRes))
return
$toReturn;
oci_close($toReturn);
return
false;
}
?>
up
0
gotankersley at NOSPAM dot com
13 years ago
Installed on CentOS 6.2, and had lots of trouble getting it to recognize tnsnames.ora. The fix for me was:

1. Make sure apache is getting the TNS_ADMIN env variable by putting it in the /etc/init.d/httpd file:
TNS_ADMIN=/usr/lib/oracle/11.2/client64/network/admin
export PATH TNS_ADMIN

This can be debugging in PHP by <?php echo system('env'); ?> and by verifying that TNS_ADMIN is there.

2. Make sure to use the name at the beginning of the tnsnames.ora file - not the SID (although ideally they should match. However, if the name at the beginning is XXXX.world then pconnect will expect this - not the SID)
To Top