Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Erro do Oracle instantclient DYLD_LIBRARY_PATH


Eu também tenho lutado por algum tempo para encontrar uma solução para o "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 no Mac OS X. Finalmente, depois de muita pesquisa, encontrei uma solução que corrige esse erro de forma sustentável e gostaria de compartilhá-la aqui para ajudar outras pessoas.

Como pano de fundo, estou usando a instalação do PHP fornecida pela Apple no OS X 10.8.4 (PHP 5.3.15 com Suhosin-Patch) e usei o repositório PECL para instalar a extensão OCI8 depois de baixar o Oracle Instant Client downloads do Oracle.com.

Também testei todas as soluções para esse erro que encontrei on-line, incluindo a configuração do DYLD_LIBRARY_PATH , ORACLE_HOME e LD_LIBRARY_PATH variáveis ​​de ambiente do sistema em meu ~/.bash_profile e ~/.bashrc arquivos; tentando configurar as variáveis ​​de ambiente via mod_env do Apache módulo e SetEnv em httpd.conf; definindo as variáveis ​​de ambiente via putenv("DYLD_LIBRARY_PATH=/...") em código PHP; assim como outras sugestões, mas todas não conseguiram resolver o erro.

A única solução de trabalho que encontrei no passado, que usei na minha instalação anterior do OS X 10.7.8, envolvia copiar o conteúdo das bibliotecas do Oracle Instant Client para as pastas do sistema sempre pesquisadas, mas ocultas:/usr/include , /usr/bin e /usr/lib . No entanto, senti que essa solução não era ideal e potencialmente dificultaria a manutenção e atualização das bibliotecas a longo prazo, e senti que uma solução sustentável para esse problema deveria existir em algum lugar.

Finalmente, depois de muita pesquisa adicional, me deparei com um post nos fóruns do OpenSUSE que detalhava como um grupo de usuários havia resolvido o mesmo erro de OCI no Apache/PHP no OpenSUSE. A postagem do fórum também expandiu os comentários que eu tinha visto em outras postagens do fórum que falavam sobre a existência de vários tipos de 'variáveis ​​de ambiente' em uma configuração típica do Apache/PHP:
  • Existem variáveis ​​de ambiente Apache, que geralmente são configuradas via mod_env - eles aparecem no Apache Environment seção do php_info() página.
  • Existem variáveis ​​de ambiente PHP, geralmente definidas via php.ini ou putenv() , e torne-se acessível em seus scripts via getenv() e métodos semelhantes.
  • Finalmente, há o que estou me referindo aqui como 'variáveis ​​de ambiente específicas do processo' - essas são variáveis ​​de ambiente que devem ser configuradas antes que o processo do Apache seja iniciado e como parte do próprio processo de inicialização do Apache. Não é suficiente especificar essas variáveis ​​de ambiente em seu ~/.bash_profile por exemplo. Essas variáveis ​​de ambiente especiais são herdadas pelo processo do Apache quando ele é iniciado, e crucialmente , por todos os seus processos filhos, incluindo outros spawns do processo Apache e pelo próprio PHP - e são essas mesmas 'variáveis ​​de ambiente específicas do processo' que precisamos configurar para resolver de forma permanente e sustentável nosso problema com a biblioteca OCI8. Quando configuradas corretamente, essas variáveis ​​de ambiente aparecerão em Environment Variables seção do php_info() página.

A pista que me levou à solução no Mac OS X foi a postagem no fórum OpenSUSE que incluiu um comentário do membro do fórum, key_nap , que notou que quando o processo Apache foi iniciado no OpenSUSE, um arquivo de configuração especial também estava sendo carregado. Este arquivo, /usr/share/apache2/load_configuration acabou sendo um script bash, e ocorreu a eles que poderiam incluir o export DYLD_LIBRARY_PATH=... relevante instruções dentro desse script bash e que, configurando as variáveis ​​de ambiente lá, elas seriam herdadas pelo processo do Apache e seus filhos na inicialização.

Isso me levou a me perguntar onde no Mac OS X poderíamos configurar corretamente essas mesmas 'variáveis ​​de ambiente específicas do processo'. Como launchd é usado quase que exclusivamente no OS X para lidar com o carregamento de processos do sistema, gostaria de saber se poderíamos configurar as variáveis ​​de ambiente necessárias no launchd do Apache arquivo de configuração? No OS X 10.8, você deve encontrar o launchd do Apache configuração .plist arquivo em /System/Library/LaunchDaemons/org.apache.httpd.plist . Quando abri o arquivo no meu sistema, notei imediatamente uma seção para especificar variáveis ​​de ambiente!

Nossa solução, portanto (testada para funcionar no Mac OS X 10.8.4), foi editar o arquivo org.apache.httpd.plist como mostrado abaixo (observe a inclusão de ORACLE_HOME , DYLD_LIBRARY_PATH e LD_LIBRARY_PATH para a seção EnvironmentVariables do arquivo) e, em seguida, reinicie o Apache executando sudo apachectl restart do 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>

Ao adicionar essas definições de 'variável de ambiente específica do processo' ao Apache launchd arquivo de configuração, garantimos que essas variáveis ​​de ambiente sejam herdadas corretamente pelo Apache e todos os seus processos filhos, que incluem PHP e quaisquer módulos que o PHP carregue, como OCI8! Obviamente, você deve substituir o caminho /Users/workstation/Oracle/... mostrado no exemplo acima com os caminhos corretos para sua própria instalação do Oracle Client Libraries – use os mesmos valores que você usaria ao especificar essas variáveis ​​de ambiente em seu ~/.bash_profile .

Certifique-se também de ter a versão correta das bibliotecas do Oracle Instant Client instaladas para o seu sistema - ou seja, as variantes de 32 ou 64 bits, dependendo de qual versão do OS X você está executando e se o Apache e o PHP estão ou não em execução Modo de 32 ou 64 bits. No OS X 10.8 e superior, o Apache/PHP deve ser executado como processos de 64 bits. Se você não tiver certeza, você pode fazer o que eu fiz no meu Mac anterior e combinar as versões de 32 e 64 bits dos binários da biblioteca do Oracle Instant Client em um único fat-binaries multi-arquitetura usando o lipo ferramenta do XCode que criará binários que carregam em qualquer plataforma.

Por fim, a solução detalhada acima para configurar variáveis ​​de ambiente no launchd do Apache O arquivo de configuração também deve funcionar para resolver erros semelhantes em outros módulos PHP executados via Apache que dependem de variáveis ​​de ambiente para encontrar suas bibliotecas vinculadas. Se estiver executando o PHP a partir da linha de comando, você poderá especificar todas as variáveis ​​de ambiente necessárias em seu ~/.bash_profile e/ou ~/.bashrc arquivos.