Oracle
 sql >> Base de données >  >> RDS >> Oracle

Erreur DYLD_LIBRARY_PATH du client instantané Oracle

Moi aussi j'ai du mal depuis un certain temps à trouver une solution au "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" erreur sur Mac OS X. Enfin, après de nombreuses recherches, j'ai trouvé une solution qui corrige durablement cette erreur, et j'ai souhaité la partager ici pour aider les autres.

En guise de contexte, j'utilise l'installation de PHP fournie par Apple sur OS X 10.8.4 (PHP 5.3.15 avec Suhosin-Patch) et j'ai utilisé le référentiel PECL pour installer l'extension OCI8 après avoir téléchargé Oracle Instant Client téléchargements depuis Oracle.com.

J'ai également testé toutes les solutions pour cette erreur que j'ai pu trouver en ligne, y compris la définition du DYLD_LIBRARY_PATH , ORACLE_HOME , et LD_LIBRARY_PATH variables d'environnement système dans mon ~/.bash_profile et ~/.bashrc des dossiers; tentative de configuration des variables d'environnement via le mod_env d'Apache module et SetEnv dans httpd.conf; définir les variables d'environnement via putenv("DYLD_LIBRARY_PATH=/...") en code PHP ; ainsi que d'autres suggestions, mais toutes n'ont pas réussi à résoudre l'erreur.

La seule solution de travail que j'avais trouvée dans le passé, que j'utilisais sur mon installation précédente d'OS X 10.7.8, impliquait de copier le contenu des bibliothèques Oracle Instant Client dans les dossiers système toujours recherchés mais cachés :/usr/include , /usr/bin , et /usr/lib . Cependant, j'ai estimé que cette solution n'était pas idéale et rendrait potentiellement difficile la maintenance et la mise à niveau des bibliothèques à long terme, et j'ai estimé qu'une solution durable à ce problème devait exister quelque part.

Enfin, après de nombreuses recherches supplémentaires, je suis tombé sur un article sur les forums OpenSUSE qui détaillait comment un groupe d'utilisateurs avait résolu la même erreur OCI sous Apache/PHP sur OpenSUSE. Le message du forum a également développé des commentaires que j'avais vus dans d'autres messages du forum qui parlaient de l'existence de plusieurs types de "variables d'environnement" dans une configuration Apache/PHP typique :

  • Il existe des variables d'environnement Apache, qui sont généralement configurées via mod_env - ceux-ci apparaissent dans l'Apache Environment section de la php_info() page.
  • Il existe des variables d'environnement PHP, généralement définies via php.ini ou putenv() , et deviennent accessibles dans vos scripts via getenv() et méthodes similaires.
  • Enfin, il y a ce que j'appelle ici des "variables d'environnement spécifiques au processus" - ce sont des variables d'environnement qui doivent être configurées avant le lancement du processus Apache, et dans le cadre du processus de lancement Apache lui-même. Il ne suffit pas de spécifier ces variables d'environnement dans son ~/.bash_profile par exemple. Ces variables d'environnement spéciales sont héritées par le processus Apache lors de son lancement, et surtout , par tous ses processus enfants, y compris les autres spawns du processus Apache et par PHP lui-même - et ce sont ces "variables d'environnement spécifiques au processus" que nous devons configurer afin de résoudre de manière permanente et durable notre problème avec la bibliothèque OCI8. Lorsqu'elles sont configurées correctement, ces variables d'environnement apparaîtront dans les Environment Variables section de la php_info() page.

L'indice qui m'a conduit à la solution sur Mac OS X provenait du message sur le forum OpenSUSE qui comprenait un commentaire d'un membre du forum, key_nap , qui a remarqué que lorsque le processus Apache a été lancé sur OpenSUSE, un fichier de configuration spécial était également chargé. Ce fichier, /usr/share/apache2/load_configuration s'est avéré être un script bash, et il leur est venu à l'esprit qu'ils pourraient inclure le export DYLD_LIBRARY_PATH=... pertinent instructions dans ce script bash, et qu'en y configurant les variables d'environnement, elles seraient héritées par le processus Apache et ses enfants lors du lancement.

Cela m'a amené à me demander où, sur Mac OS X, nous serions en mesure de configurer correctement ces mêmes "variables d'environnement spécifiques au processus". En tant que launchd est utilisé presque exclusivement sur OS X pour gérer le chargement des processus système, je me demandais si nous serions capables de configurer les variables d'environnement nécessaires dans le launchd d'Apache fichier de configuration? Sur OS X 10.8, vous devriez trouver le launchd d'Apache configuration .plist fichier à /System/Library/LaunchDaemons/org.apache.httpd.plist . Lorsque j'ai ouvert le fichier sur mon système, j'ai immédiatement remarqué une section pour spécifier les variables d'environnement !

Notre solution donc (testée pour fonctionner sur Mac OS X 10.8.4), était d'éditer le org.apache.httpd.plist fichier comme indiqué ci-dessous (notez l'inclusion de ORACLE_HOME , DYLD_LIBRARY_PATH , et LD_LIBRARY_PATH à la section EnvironmentVariables du fichier), puis redémarrer Apache en exécutant sudo apachectl restart depuis le terminal.

<?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>

En ajoutant ces définitions de "variables d'environnement spécifiques au processus" à Apache launchd fichier de configuration, nous nous assurons que ces variables d'environnement sont correctement héritées par Apache et tous ses processus enfants, qui incluent PHP et tous les modules chargés par PHP tels que OCI8 ! Vous devez évidemment remplacer le chemin /Users/workstation/Oracle/... illustré dans l'exemple ci-dessus avec les chemins corrects vers votre propre installation des bibliothèques client Oracle - utilisez les mêmes valeurs que vous le feriez lors de la spécification de ces variables d'environnement dans votre ~/.bash_profile .

Assurez-vous également que la version correcte des bibliothèques Oracle Instant Client est installée pour votre système - c'est-à-dire les variantes 32 bits ou 64 bits selon la version d'OS X que vous utilisez et si Apache et PHP s'exécutent ou non. Mode 32 ou 64 bits. Sur OS X 10.8 et supérieur, Apache/PHP doit s'exécuter en tant que processus 64 bits. Si vous n'êtes pas sûr, vous pouvez faire ce que j'ai fait sur mon ancien Mac et combiner les versions 32 et 64 bits des fichiers binaires de la bibliothèque Oracle Instant Client en un seul fichier binaire multi-architecture à l'aide du lipo outil de XCode qui créera des fichiers binaires qui se chargent sur l'une ou l'autre plate-forme.

Enfin, la solution détaillée ci-dessus pour configurer les variables d'environnement dans le launchd d'Apache Le fichier de configuration devrait également fonctionner pour résoudre des erreurs similaires dans d'autres modules PHP exécutés via Apache qui s'appuient sur des variables d'environnement pour trouver leurs bibliothèques liées. Si vous exécutez PHP à partir de la ligne de commande, vous devriez pouvoir spécifier toutes les variables d'environnement dont vous avez besoin dans votre ~/.bash_profile et/ou ~/.bashrc fichiers.