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 noApache Environment
seção dophp_info()
página. - Existem variáveis de ambiente PHP, geralmente definidas via
php.ini
ouputenv()
, e torne-se acessível em seus scripts viagetenv()
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 emEnvironment Variables
seção dophp_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.