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 laphp_info()
page. - Il existe des variables d'environnement PHP, généralement définies via
php.ini
ouputenv()
, et deviennent accessibles dans vos scripts viagetenv()
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 lesEnvironment Variables
section de laphp_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.