[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;
}
?>
oci_pconnect
(PHP 5, PECL OCI8 >= 1.1.0)
oci_pconnect — Ouvre une connexion persistante à un serveur Oracle
Description
Ouvre une connexion persistante à un serveur Oracle et s'identifie.
Les connexions persistantes sont mises en cache et sont réutilisées entre les requêtes, réduisant ainsi la charge à chaque chargement de la page ; une application PHP typique a une seule connexion persistante à un serveur Oracle par processus enfant Apache (ou processus PHP FastCGI/CGI). Voir la section sur les connexions persistantes aux bases de données pour plus d'informations.
Liste de paramètres
- username
-
Le nom d'utilisateur Oracle.
- password
-
Le mot de passe de l'utilisateur.
- db
-
Peut contenir l'instance locale d'Oracle ou un nom disponible dans le fichier tnsnames.ora.
S'il n'est pas fourni, PHP va chercher la valeur dans les variables d'environnement ORACLE_SID et TWO_TASK pour déterminer le nom de l'instance locale d'Oracle, et la localisation du fichier tnsnames.ora.
- charset
-
Détermine le jeu de caractères utilisé par la bibliothèque cliente Oracle. Le jeu de caractères n'a pas besoin d'être identique à celui utilisé par la base de données. S'il ne correspond pas, Oracle ferait de son mieux pour convertir les données depuis le jeu de caractères de la base de données. Suivant les jeux de caractères, il se peut que le résultat ne soit pas parfait. De plus, cette convertion nécessite un peu de temps système.
Si non spécifié, la bibliothèque cliente Oracle déterminera un jeu de caractères depuis la variable d'environnement NLS_LANG.
Le fait de passer ce paramètre peut réduire la durée de connexion.
- session_mode
-
Ce paramètre est disponible depuis la version 1.1 et accepte les valeurs suivantes : OCI_DEFAULT, OCI_SYSOPER et OCI_SYSDBA. Si OCI_SYSOPER ou OCI_SYSDBA sont spécifiés, oci_connect() tentera d'établir une connexion privilégiée en utilisant les droits externes. Les connexions privilégiées sont désactivées par défaut. Pour les activer, vous devez définir oci8.privileged_connect à On.
Valeurs de retour
Retourne un identifiant de connexion, ou FALSE si une erreur survient.
Notes
Note: Depuis la version 1.1 de l'extension oci8, la durée de vie ainsi que le nombre maximal de connexions persistantes Oracle peuvent être affinés en définissant les valeurs de configuration suivantes : oci8.persistent_timeout, oci8.ping_interval et oci8.max_persistent.
Note: Si vous utilisez PHP avec le client Oracle Instant, vous pouvez utiliser les méthodes de nommage pour faciliter la connexion tel que décrites ici : » http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm#NETAG255. En fait, cela signifie que vous pouvez spécifier "//db_host[:port]/database_name" en tant que nom de base de données. Mais si vous voulez utiliser l'ancienne méthode de nommage, vous devez définir soit ORACLE_HOME, soit TNS_ADMIN.
Note: Dans les versions de PHP antérieures à la version 5.0.0, vous devez utiliser la fonction ociplogon(). Cet ancien nom est toujours utilisable : un alias a été fait vers la fonction oci_pconnect(), pour assurer la compatibilité ascendante. Toutefois, il est recommandé de ne plus l'utiliser.
Voir aussi
- oci_connect() - Établit une connexion avec un serveur Oracle
- oci_new_connect() - Établit une nouvelle connexion au serveur Oracle
oci_pconnect
09-Oct-2008 04:38
