Oracle instantclient DYLD_LIBRARY_PATH错误

时间:2013-11-21 09:09:47

标签: php macos oracle xampp

我在OSX 10.9上使用Xamppp for Macos和Php 5.4.19 我已经安装了oracle instantclient,我可以看到oci8在phpinfo中启用了(下面):

启用OCI8支持 版本1.4.9 修订版$ Id:44bfa713983a99b3e59477f6532e5fb51b6dee94 $ 活动持久连接0 活动连接0

我可以看到我的phpinfo中也设置了DYLD_LIBRARY_PATH

DYLD_LIBRARY_PATH /usr/local/instantclient/11.2.0.3

但是当我尝试连接php时,我现在有两天同样的错误:(

  

警告:oci_connect():OCIEnvNlsCreate()失败。您的系统出了问题 - 请检查DYLD_LIBRARY_PATH是否包含第6行的info.php中带有Oracle Instant Client库的目录   警告:oci_connect():尝试在第6行的info.php中检索错误ORA-01804的文本时出错

任何帮助都会很棒。 感谢。

2 个答案:

答案 0 :(得分:8)

我也一直在努力寻找Mac OS X上"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"错误的解决方案。经过大量研究后,我找到了一个可持续修复此错误的解决方案,并希望在此处分享帮助他人。

作为一个小背景,我在OS X 10.8.4(带有Suhosin-Patch的PHP 5.3.15)上使用Apple提供的PHP安装,并在我下载后使用PECL存储库安装OCI8扩展Oracle Instant Client从Oracle.com下载。

我还测试了我能够在线找到的此错误的所有解决方案,包括在{{1}中设置DYLD_LIBRARY_PATHORACLE_HOMELD_LIBRARY_PATH系统环境变量1}}和~/.bash_profile个文件;尝试通过Apache的~/.bashrc模块和mod_env中的SetEnv配置环境变量;在PHP代码中通过httpd.conf设置环境变量;以及其他建议,但都未能解决错误。

我过去发现的唯一可行的解​​决方案,我在之前的OS X 10.7.8安装中使用的解决方案包括将Oracle Instant Client库的内容复制到始终搜索但隐藏的系统文件夹:{{1 },putenv("DYLD_LIBRARY_PATH=/...")/usr/include。但是,我觉得这个解决方案并不理想,并且可能会使得长期维护和升级库变得困难,我觉得这个问题的可持续解决方案必须存在于某个地方。

经过大量的额外研究后,我偶然发现了一篇关于OpenSUSE论坛的文章,其中详细介绍了一组用户如何在OpenSUSE上解决Apache / PHP下的相同OCI错误。论坛帖子还扩展了我在其他论坛帖子中看到的评论,这些评论谈到了有多种类型的环境变量'在典型的Apache / PHP设置中:

  • 有Apache环境变量,通常通过/usr/bin配置 - 这些变量显示在/usr/lib页面的mod_env部分。
  • 有PHP环境变量,通常通过Apache Environmentphp_info()设置,并可通过php.ini和类似方法在您的脚本中访问。
  • 最后,我在这里指的是处理特定的环境变量' - 这些是必须在Apache进程启动之前配置的环境变量,并且是Apache启动过程本身的一部分。例如,在一个putenv()中指定这些环境变量是不够的。这些特殊的环境变量在Apache进程启动时继承,并且至关重要,由其所有子进程(包括Apache进程的其他生成源和PHP本身)继承 - 而且这些非常'处理特定的环境变量'我们需要配置为永久和可持续地解决我们的OCI8库问题。正确配置后,这些环境变量将显示在getenv()页面的~/.bash_profile部分。

导致我在Mac OS X上获得解决方案的线索来自OpenSUSE forum上的帖子,其中包含论坛成员 key_nap 的评论,他注意到Apache进程时在OpenSUSE上启动,也加载了一个特殊的配置文件。这个文件Environment Variables原来是一个bash脚本,他们发现他们可以在这个bash脚本中包含相关的php_info()语句,并且通过在那里配置环境变量,他们会在启动时由Apache进程及其子进程继承。

这让我想知道在Mac OS X上我们能够正确配置这些相同的特定于过程的环境变量'。由于/usr/share/apache2/load_configuration几乎专门用于OS X来处理系统进程的加载,我想知道我们是否能够在Apache的export DYLD_LIBRARY_PATH=...配置文件中配置必要的环境变量?在OS X 10.8上,您应该在launchd找到Apache的launchd配置launchd文件。当我在系统上打开文件时,我立即注意到一个用于指定环境变量的部分!

我们的解决方案(经过测试适用于Mac OS X 10.8.4)是编辑.plist文件,如下所示(请注意包含/System/Library/LaunchDaemons/org.apache.httpd.plistorg.apache.httpd.plistORACLE_HOME到文件的EnvironmentVariables部分),然后通过从终端运行DYLD_LIBRARY_PATH重新启动Apache。

LD_LIBRARY_PATH

通过添加这些特定于流程的特定环境变量&#39; Apache sudo apachectl restart配置文件的定义,我们确保这些环境变量被Apache及其所有子进程正确继承,包括PHP和PHP加载的任何模块,如OCI8!显然,您应该将上面示例中显示的路径<?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> 替换为您自己安装Oracle客户端库的正确路径 - 使用与在launchd中指定这些环境变量时相同的值。

还要确保为系统安装了正确版本的Oracle Instant Client库 - 即32位或64位变体,具体取决于您运行的OS X版本以及Apache和PHP是否以32位或64位模式运行。在OS X 10.8及更高版本上,Apache / PHP应该作为64位进程运行。如果您不确定,可以使用我在以前的Mac上执行的操作,并使用XCode中的/Users/workstation/Oracle/...工具将32位和64位版本的Oracle Instant Client库二进制文件合并到单个多架构胖二进制文件中这将创建在任一平台上加载的二进制文件。

最后,上面详述的在Apache的~/.bash_profile配置文件中配置环境变量的解决方案也应该可以解决在Apache上运行的其他PHP模块中的类似错误,这些模块依赖于环境变量来查找它们的链接库。如果从命令行运行PHP,您应该能够在lipo和/或launchd文件中指定所需的所有环境变量。

答案 1 :(得分:1)

首次在Mac OS / X上安装Instant Client时遇到了类似的问题。

我找到了以下博客:

http://blog.caseylucas.com/2013/03/03/oracle-sqlplus-and-instant-client-on-mac-osx-without-dyld_library_path/

希望它也适合你。