我在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的文本时出错
任何帮助都会很棒。 感谢。
答案 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_PATH
,ORACLE_HOME
和LD_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设置中:
/usr/bin
配置 - 这些变量显示在/usr/lib
页面的mod_env
部分。Apache Environment
或php_info()
设置,并可通过php.ini
和类似方法在您的脚本中访问。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.plist
,org.apache.httpd.plist
和ORACLE_HOME
到文件的EnvironmentVariables部分),然后通过从终端运行DYLD_LIBRARY_PATH
重新启动Apache。
LD_LIBRARY_PATH
通过添加这些特定于流程的特定环境变量' 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时遇到了类似的问题。
我找到了以下博客:
希望它也适合你。