Oracle
 sql >> Database >  >> RDS >> Oracle

Errore DYLD_LIBRARY_PATH del client istantaneo Oracle

Anch'io ho lottato per un po' di tempo per trovare una soluzione al "PHP Warning: oci_new_connect(): OCIEnvNlsCreate() failed. There is something wrong with your system - please check that DYLD_LIBRARY_PATH includes the directory with Oracle Instant Client libraries" errore su Mac OS X. Alla fine, dopo molte ricerche, ho trovato una soluzione che corregge in modo sostenibile questo errore e desideravo condividerlo qui per aiutare gli altri.

Come piccolo sfondo, sto utilizzando l'installazione di PHP fornita da Apple su OS X 10.8.4 (PHP 5.3.15 con Suhosin-Patch) e ho utilizzato il repository PECL per installare l'estensione OCI8 dopo aver scaricato Oracle Instant Client download da Oracle.com.

Ho anche testato tutte le soluzioni per questo errore che sono riuscito a trovare online, inclusa l'impostazione di DYLD_LIBRARY_PATH , ORACLE_HOME e LD_LIBRARY_PATH variabili di ambiente di sistema nel mio ~/.bash_profile e ~/.bashrc File; tentando di configurare le variabili di ambiente tramite mod_env di Apache modulo e SetEnv in httpd.conf; impostazione delle variabili di ambiente tramite putenv("DYLD_LIBRARY_PATH=/...") nel codice PHP; così come altri suggerimenti, ma tutti non sono riusciti a risolvere l'errore.

L'unica soluzione funzionante che avevo trovato in passato, che ho usato sulla mia precedente installazione di OS X 10.7.8 prevedeva la copia del contenuto delle librerie Oracle Instant Client nelle cartelle di sistema sempre cercate, ma nascoste:/usr/include , /usr/bin e /usr/lib . Tuttavia, ho ritenuto che questa soluzione non fosse l'ideale e avrebbe potenzialmente reso difficile la manutenzione e l'aggiornamento delle librerie a lungo termine, e ho sentito che una soluzione sostenibile a questo problema doveva esistere da qualche parte.

Alla fine, dopo molte ricerche aggiuntive, mi sono imbattuto in un post sui forum di OpenSUSE che descriveva in dettaglio come un gruppo di utenti aveva risolto lo stesso errore OCI sotto Apache/PHP su OpenSUSE. Il post del forum ha anche ampliato i commenti che avevo visto in altri post del forum che parlavano dell'esistenza di più tipi di "variabili di ambiente" in una tipica configurazione Apache/PHP:

  • Ci sono variabili d'ambiente Apache, che di solito sono configurate tramite mod_env - questi appaiono nell'Apache Environment sezione del php_info() pagina.
  • Ci sono variabili d'ambiente PHP, di solito impostate tramite php.ini o putenv() e diventa accessibile nei tuoi script tramite getenv() e metodi simili.
  • Infine, ci sono quelle a cui mi riferisco qui come "variabili di ambiente specifiche del processo":si tratta di variabili di ambiente che devono essere configurate prima dell'avvio del processo Apache e come parte del processo di avvio di Apache stesso. Non è sufficiente specificare queste variabili d'ambiente nel proprio ~/.bash_profile Per esempio. Queste variabili d'ambiente speciali vengono ereditate dal processo Apache all'avvio, e soprattutto , da tutti i suoi processi figlio inclusi altri spawn del processo Apache e dallo stesso PHP - e sono proprio queste "variabili di ambiente specifiche del processo" che dobbiamo configurare per risolvere in modo permanente e sostenibile il nostro problema con la libreria OCI8. Se configurate correttamente, queste variabili d'ambiente appariranno in Environment Variables sezione del php_info() pagina.

L'indizio che mi ha portato alla soluzione su Mac OS X è stato il post sul forum OpenSUSE che includeva un commento di un membro del forum, key_nap , il quale ha notato che quando il processo Apache è stato avviato su OpenSUSE, veniva caricato anche uno speciale file di configurazione. Questo file, /usr/share/apache2/load_configuration si è rivelato essere uno script bash e gli è venuto in mente che potevano includere il relativo export DYLD_LIBRARY_PATH=... istruzioni all'interno di questo script bash e che, configurando lì le variabili di ambiente, sarebbero state ereditate dal processo Apache e dai suoi figli al momento dell'avvio.

Questo mi ha portato a chiedermi dove su Mac OS X saremmo in grado di configurare correttamente queste stesse "variabili di ambiente specifiche del processo". Come launchd viene utilizzato quasi esclusivamente su OS X per gestire il caricamento dei processi di sistema, mi chiedevo se saremmo stati in grado di configurare le variabili di ambiente necessarie in launchd di Apache file di configurazione? Su OS X 10.8, dovresti trovare launchd di Apache configurazione .plist file in /System/Library/LaunchDaemons/org.apache.httpd.plist . Quando ho aperto il file sul mio sistema, ho notato immediatamente una sezione per specificare le variabili d'ambiente!

La nostra soluzione quindi (testata per funzionare su Mac OS X 10.8.4), era quella di modificare il org.apache.httpd.plist come mostrato di seguito (notare l'inclusione di ORACLE_HOME , DYLD_LIBRARY_PATH e LD_LIBRARY_PATH nella sezione EnvironmentVariables del file), quindi riavviare Apache eseguendo sudo apachectl restart dal terminale.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Disabled</key>
    <true/>
    <key>Label</key>
    <string>org.apache.httpd</string>
    <key>EnvironmentVariables</key>
    <dict>
        <key>XPC_SERVICES_UNAVAILABLE</key>
        <string>1</string>
        <key>ORACLE_HOME</key>
        <string>/Users/workstation/Oracle</string>
        <key>DYLD_LIBRARY_PATH</key>
        <string>/Users/workstation/Oracle/lib</string>
        <key>LD_LIBRARY_PATH</key>
        <string>/Users/workstation/Oracle/lib</string>
    </dict>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/sbin/httpd-wrapper</string>
        <string>-D</string>
        <string>FOREGROUND</string>
    </array>
    <key>OnDemand</key>
    <false/>
    <key>SHAuthorizationRight</key>
    <string>system.preferences</string>
</dict>
</plist>

Aggiungendo queste definizioni di "variabili di ambiente specifiche del processo" a launchd di Apache file di configurazione, ci assicuriamo che queste variabili di ambiente siano ereditate correttamente da Apache e da tutti i suoi processi figlio, che includono PHP e tutti i moduli caricati da PHP come OCI8! Dovresti ovviamente sostituire il percorso /Users/workstation/Oracle/... mostrato nell'esempio sopra con i percorsi corretti per la tua installazione delle librerie client Oracle:usa gli stessi valori che utilizzeresti quando specifichi queste variabili di ambiente nel tuo ~/.bash_profile .

Assicurati inoltre di avere la versione corretta delle librerie Oracle Instant Client installate per il tuo sistema, ovvero le varianti a 32 o 64 bit a seconda della versione di OS X in esecuzione e se Apache e PHP sono in esecuzione o meno in Modalità a 32 o 64 bit. Su OS X 10.8 e versioni successive, Apache/PHP dovrebbe essere eseguito come processi a 64 bit. Se non sei sicuro, puoi fare quello che ho fatto sul mio precedente Mac e combinare le versioni a 32 e 64 bit dei binari della libreria Oracle Instant Client in singoli fat-binari multi-architettura utilizzando lipo strumento di XCode che creerà binari che verranno caricati su entrambe le piattaforme.

Infine, la soluzione sopra descritta per configurare le variabili di ambiente in launchd di Apache il file di configurazione dovrebbe anche funzionare per risolvere errori simili in altri moduli PHP eseguiti tramite Apache che si basano su variabili di ambiente per trovare le loro librerie collegate. Se esegui PHP dalla riga di comando dovresti essere in grado di specificare tutte le variabili di ambiente di cui hai bisogno nel tuo ~/.bash_profile e/o ~/.bashrc file.