sql >> Base de Datos >  >> RDS >> Oracle

Error DYLD_LIBRARY_PATH del cliente instantáneo de Oracle

Yo también he estado luchando durante algún tiempo para encontrar una solución 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" error en Mac OS X. Finalmente, después de mucha investigación, encontré una solución que corrige este error de manera sostenible y deseaba compartirla aquí para ayudar a otros.

Como un poco de información, estoy usando la instalación de PHP provista por Apple en OS X 10.8.4 (PHP 5.3.15 con Suhosin-Patch), y usé el repositorio PECL para instalar la extensión OCI8 después de haber descargado Oracle Instant Client descargas desde Oracle.com.

También probé todas las soluciones para este error que pude encontrar en línea, incluida la configuración de DYLD_LIBRARY_PATH , ORACLE_HOME y LD_LIBRARY_PATH variables de entorno del sistema en mi ~/.bash_profile y ~/.bashrc archivos; intentando configurar las variables de entorno a través de mod_env de Apache módulo y SetEnv en httpd.conf; configurando las variables de entorno a través de putenv("DYLD_LIBRARY_PATH=/...") en código PHP; así como otras sugerencias, pero todas fallaron en resolver el error.

La única solución funcional que había encontrado en el pasado, que usé en mi instalación anterior de OS X 10.7.8, consistía en copiar el contenido de las bibliotecas de Oracle Instant Client en las carpetas del sistema siempre buscadas pero ocultas:/usr/include , /usr/bin y /usr/lib . Sin embargo, sentí que esta solución no era ideal y que potencialmente dificultaría el mantenimiento y la actualización de las bibliotecas a largo plazo, y sentí que una solución sostenible a este problema tenía que existir en alguna parte.

Finalmente, después de mucha investigación adicional, encontré una publicación en los foros de OpenSUSE que detallaba cómo un grupo de usuarios había resuelto el mismo error de OCI en Apache/PHP en OpenSUSE. La publicación del foro también amplió los comentarios que había visto en otras publicaciones del foro que hablaban de que había múltiples tipos de 'variable de entorno' en una configuración típica de Apache/PHP:

  • Hay variables de entorno de Apache, que generalmente se configuran a través de mod_env - estos aparecen en el Apache Environment sección del php_info() página.
  • Hay variables de entorno de PHP, generalmente configuradas a través de php.ini o putenv() , y sea accesible en sus scripts a través de getenv() y métodos similares.
  • Finalmente, a lo que me refiero aquí como 'variables de entorno específicas del proceso':estas son variables de entorno que deben configurarse antes de iniciar el proceso de Apache y como parte del propio proceso de inicio de Apache. No es suficiente especificar estas variables de entorno en el propio ~/.bash_profile por ejemplo. Estas variables de entorno especiales son heredadas por el proceso de Apache cuando se inicia, y crucialmente , por todos sus procesos secundarios, incluidos otros engendros del proceso Apache y por PHP mismo, y son estas mismas 'variables de entorno específicas del proceso' las que debemos configurar para resolver de forma permanente y sostenible nuestro problema con la biblioteca OCI8. Cuando se configuran correctamente, estas variables de entorno aparecerán en Environment Variables sección del php_info() página.

La pista que me llevó a la solución en Mac OS X fue de la publicación en el foro de OpenSUSE que incluía un comentario del miembro del foro, key_nap , quien se dio cuenta de que cuando se iniciaba el proceso de Apache en OpenSUSE, también se cargaba un archivo de configuración especial. Este archivo, /usr/share/apache2/load_configuration resultó ser un script de bash, y se les ocurrió que podrían incluir el export DYLD_LIBRARY_PATH=... relevante declaraciones dentro de este script bash, y que al configurar las variables de entorno allí, serían heredadas por el proceso de Apache y sus hijos al iniciarse.

Esto me lleva a preguntarme en qué parte de Mac OS X podríamos configurar correctamente estas mismas 'variables de entorno específicas del proceso'. Como launchd se usa casi exclusivamente en OS X para manejar la carga de los procesos del sistema, me preguntaba si seríamos capaces de configurar las variables de entorno necesarias en el launchd de Apache. ¿archivo de configuración? En OS X 10.8, debería encontrar launchd de Apache configuración .plist archivo en /System/Library/LaunchDaemons/org.apache.httpd.plist . Cuando abrí el archivo en mi sistema, inmediatamente noté una sección para especificar variables de entorno.

Por lo tanto, nuestra solución (probada para funcionar en Mac OS X 10.8.4) fue editar el org.apache.httpd.plist archivo como se muestra a continuación (observe la inclusión de ORACLE_HOME , DYLD_LIBRARY_PATH y LD_LIBRARY_PATH a la sección EnvironmentVariables del archivo), y luego reinicie Apache ejecutando sudo apachectl restart desde la 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>

Al agregar estas definiciones de 'variable de entorno específica del proceso' a Apache launchd archivo de configuración, nos aseguramos de que Apache y todos sus procesos secundarios hereden correctamente estas variables de entorno, que incluyen PHP y cualquier módulo que cargue PHP, como OCI8. Obviamente, debe reemplazar la ruta /Users/workstation/Oracle/... que se muestra en el ejemplo anterior con las rutas correctas a su propia instalación de Oracle Client Libraries:use los mismos valores que usaría al especificar estas variables de entorno en su ~/.bash_profile .

También asegúrese de tener instalada la versión correcta de Oracle Instant Client Libraries para su sistema, es decir, las variantes de 32 bits o de 64 bits según la versión de OS X que esté ejecutando y si Apache y PHP se están ejecutando o no. Modo de 32 o 64 bits. En OS X 10.8 y superior, Apache/PHP debería ejecutarse como procesos de 64 bits. Si no está seguro, puede hacer lo que hice en mi Mac anterior y combinar las versiones de 32 y 64 bits de los archivos binarios de la biblioteca de Oracle Instant Client en archivos binarios gordos únicos de varias arquitecturas utilizando lipo herramienta de XCode que creará archivos binarios que se cargarán en cualquier plataforma.

Por último, la solución detallada anteriormente para configurar variables de entorno en launchd de Apache El archivo de configuración también debería funcionar para resolver errores similares en otros módulos de PHP ejecutados a través de Apache que dependen de variables de entorno para encontrar sus bibliotecas vinculadas. Si ejecuta PHP desde la línea de comandos, debería poder especificar todas las variables de entorno que necesita en su ~/.bash_profile y/o ~/.bashrc archivos.