[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
-
Si vous utilisez un serveur Oracle version 9.2 et suivant, vous pouvez renseigner le paramètre charset , qui peut être utilisé dans la nouvelle connexion. Si vous utilisez un serveur Oracle inférieur à la version 9.2, ce paramètre sera ignoré et la variable d'environnement NLS_LANG sera utilisée à la place.
- 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-west.oracle.com/docs/cd/B12037_01/network.101/b10775/naming.htm#i498306. 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
21-Nov-2002 06:04
If your oracle database is on a remote system within your local network and you don't want to worry about the tnsnames file you can try this.
$db = "(DESCRIPTION=(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.XX.XXX)(PORT = 1521)))(CONNECT_DATA=(SID=XXXX)))";
$c1 = ocilogon("name","password",$db);
Hope this helps someone.
26-Sep-2002 06:09
Better to insert needed variables into apache(!) (or your webserver - respectively) start script.
For example on UNIX systems /etc/init.d/apache would contain following lines before anything else:
#!/bin/bash
if [ -f ~oracle/.profile ]; then
source ~oracle/.profile
fi
The ~oracle/.profile has the appropiate settings to start an Oracle database so it is always up-to-date for PHP, too. (If settings are changed, don't forget to restart your webserver.) This way you just no need to worry what to include or define for PHP.
