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)
oci_pconnect
(PHP 5, PECL OCI8 >= 1.1.0)
oci_pconnect — Connect to an Oracle database using a persistent connection
Descrizione
$username
, string $password
[, string $connection_string
[, string $character_set
[, int $session_mode
]]] )Creates a persistent connection to an Oracle server and logs on.
Persistent connections are cached and re-used between requests, resulting in reduced overhead on each page load; a typical PHP application will have a single persistent connection open against an Oracle server per Apache child process (or PHP FastCGI/CGI process). See the Persistent Database Connections section for more information.
Elenco dei parametri
-
username -
The Oracle user name.
-
password -
The password for
username. -
connection_string -
Contiene l'istanza Oracle a cui collegarsi. Può essere una » stringa Easy Connect, oppure un Connect Name dal file tnsnames.ora, o il nome di una istanza Oracle locale.
Se non è specificato, PHP usa le variabili d'ambiente come
TWO_TASK(su Linux) oLOCAL(su Windows) eORACLE_SIDper determinare l'istanza Oracle a cui collegarsi.Per utilizzare il metodo Easy Connect, PHP deve essere linkato con le librerie Client di Oracle 10g o successivi. La stringa Easy Connect per Oracle 10g ha la forma: [//]host_name[:port][/service_name]. Con Oracle 11g, ha la forma: [//]host_name[:port][/service_name][:server_type][/instance_name]. I nomi dei servizi possono essere trovati eseguendo l'applicazione di Oracle lsnrctl status sul server contenente il database.
Il file tnsnames.ora può essere nel percorso di ricerca Oracle Net, che include $ORACLE_HOME/network/admin e /etc. In alternativa si imposti TNS_ADMIN in modo che $TNS_ADMIN/tnsnames.ora sia letto. Assicurarsi che il dameon web abbia accesso in lettura al file.
-
character_set -
Determina il set di caratteri utilizzato dalle librerie Client di Oracle. Non è necessario che il set di caratteri corrisponda a quello usato dal database. Se non corrisponde, Oracle fara il suo meglio per convertire i dati da e verso il set di caratteri del database. A seconda del set di caratteri, ciò potrebbe dare risultati non utilizzabili. La conversione inoltre inecessita di tempo aggiuntivo.
Se non specificato, le librerie Client di Oracle determinano un set di caratteri dalla variabile d'ambiente
NLS_LANG.Fornire questo parametro può ridurre il tempo di connessione.
-
session_mode -
Questo parametro è disponibile da PHP 5 (PECL OCI8 1.1) e accetta i seguenti valori:
OCI_DEFAULT,OCI_SYSOPEReOCI_SYSDBA. SeOCI_SYSOPERoOCI_SYSDBAsono specificate, questa funzione tenta di creare connessioni privilegiate usando delle credenziali esterne. Le connessioni privilegiate sono disabilitate per default. Per abilitarle occorre impostare oci8.privileged_connect a On.PHP 5.3 (PECL OCI8 1.3.4) ha introdotto il valore
OCI_CRED_EXT. Questo dice ad Oracle di usare l'autenticazione esterna o del Sistema Operativo, che deve essere configurata nel database. Il flagOCI_CRED_EXTpuò essere usato solo con username "/" e una password vuota. oci8.privileged_connect può essere On oppure Off.OCI_CRED_EXTpuò essere combinato ai modiOCI_SYSOPERoOCI_SYSDBA.OCI_CRED_EXTnon è ammessa su Windows per ragioni di sicurezza.
Valori restituiti
Returns a connection identifier or FALSE on error.
Note
Nota: Starting with PHP 5.1.2 and PECL oci8 1.1, the lifetime and maximum number of persistent Oracle connections can be tuned by setting the following configuration values: oci8.persistent_timeout, oci8.ping_interval and oci8.max_persistent.
Nota:
In PHP versions before 5.0.0 you must use ociplogon() instead. Il vecchio nome di funzione può ancora essere usato nella versione attuale, ma è comunque deprecato e non raccomandato.
Vedere anche:
- oci_connect() - Connect to an Oracle database
- oci_new_connect() - Connect to the Oracle server using a unique connection
[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;
}
?>
