问题:Linux CentOS / Oracle 11g / InstantClient / PHP 5.3.3
错误:oci_connect():OCIEnvNlsCreate()失败。你的系统有问题 - 请检查是否设置了ORACLE_HOME和LD_LIBRARY_PATH并指向正确的目录
phpinfo()相关部分:
如您所见,环境变量已正确设置,我可以使用getenv()
在页面上回显它们。我还检查了读取权限,我可以从网页上读取这些目录中的所有文件。客户端库文件(我安装并重新安装两次)完全安装。这些库是可读和可加载的。
ldd没有显示任何错误。
这是来自php文件的调用:
$test = getenv('LD_LIBRARY_PATH')." ".getenv('ORACLE_HOME');
$this->dbconn = oci_connect("myuser","mypassword", "localhost/orcl") or die("<b>Connection Failed: $test </b>").oci_error();
我尝试了通过谷歌搜索找到的所有技巧,没有任何效果 任何帮助表示赞赏。
答案 0 :(得分:8)
OCIEnvNlsCreate()失败了吗?欢迎来到地狱......
我知道线程已经老了,但问题仍然存在。通常这个问题的答案会重定向到第三方网站,通常是404s。
让我们从问题开始吧。错误本身非常通用。它的文档总结为“lib崩溃......不知道为什么”。有很多解决方案,包括但不限于配置,重新安装和祈祷“在这里插入随机神名”。
以下是最常见解决方案的简短列表:
<强> 1。将变量放在.php文件中。
putenv("LD_LIBRARY_PATH=$newld");
where $newld is the link to your library.
<强> 2。从php文件中删除变量LD_LIBRARY_PATH ,如果存在(是的,它在1中的显示方式),并将其放入apache2.conf或httpd.conf或/ etc / environment或您的发行版中的任何文件/ version有环境变量。可以在互联网上找到一个简单的指南here或无处不在。为什么呢?
不要在PHP脚本中使用putenv()设置Oracle环境变量 因为Oracle库可能会在您之前加载和初始化 脚本运行。用putenv()设置的变量可能会导致冲突, 崩溃或不可预测的行为。有些功能可能有效,但有些则可 可能会给出微妙的错误。变量应该在之前设置 Web服务器已启动。
如安装文档中所述。之后再重启apache。它是基于分发/版本的,但很可能命令是service httpd restart
。
重新安装oci8 。尽可能多次。不要强迫它。强迫只会使情况变得更糟。另外,尝试编译它(也就是下载包使用./configure -'all the fancy commands you'll need to use'
然后make install
)。
确保您获得了正确的LD_LIBRARY_PATH
。有趣的是,对吗?您可能没有注意到oracle在 N个不同位置中创建了文件夹client/lib/
,其中包含或多或少相同的文件,它们之间的唯一区别是选择除了其中一个文件夹之外的所有文件夹都会导致上述错误。理智检查?
重新安装php / apache 。您可能有一些导致问题的旧安装。因此,使用apt-get purge php*
或yum remove php*
或者为您的分发提供同样的技巧,将是一个良好的开端。
修改强> 在PHP升级之后,问题再次发生,这次采用了不同的解决方案。
编辑SYSCONFIG 编辑文件/ etc / sysconfig / httpd。最后添加这两行:
export LD_LIBRARY_PATH = / path / to.lib export ORACLE_HOME = / path / to / home
放弃并阅读手册可以找到它here。
如果这些都没有帮助,请随时浏览wall of sorrow,以获得解决方案......
答案 1 :(得分:2)
我自己也处理过这些问题,并找到了解决方案。
我的案例中的解决方案是:
授予客户端目录和文件的权限:
sudo chmod -R 777 /usr/lib/oracle/11.2/client64
和
sudo chmod -R 777 /usr/include/oracle/11.2/client64
2.我后来得到的错误:ORA-12546:TNS:许可被拒绝
setsebool -P httpd_can_network_connect 1
Apache将被授权连接数据库。
答案 2 :(得分:1)
您需要将即时客户端的所有内容复制到apache / bin
我正在使用xampp并为我工作。
将即时客户端enter image description here的所有文件复制到apache / bin
答案 3 :(得分:0)
除了在Ubuntu系统上,我自己也处理过这些问题。我们通过直接在/ etc / environment中设置环境变量并将它们从apache配置中删除来解决它。只需在环境文件的底部添加变量,它们就可以应用于系统范围。
答案 4 :(得分:0)
在apache init脚本上添加自定义环境变量。 我正在使用centos,因此,init脚本位于/etc/init.d/httpd
简单地说,将你的oracle用户的.bash_profile复制粘贴到/etc/init.d/httpd
这是我的。ORACLE_HOSTNAME=ora11g.home.com; export ORACLE_HOSTNAME
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1; export ORACLE_HOME
ORACLE_SID=ora11g; export ORACLE_SID
ORACLE_TERM=xterm; export ORACLE_TERM
PATH=$ORACLE_HOME/bin:/usr/sbin:$PATH; export PATH
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib;
export LD_LIBRARY_PATH
CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib;
export CLASSPATH
希望这个帮助
答案 5 :(得分:0)
我刚刚解决了同样的问题:
消息说:
请检查是否已设置ORACLE_HOME和LD_LIBRARY_PATH并指向正确的目录
在apache中,有一个文件可以设置环境变量:
/etc/sysconfig/httpd
。必须有一个nginx的配置文件。
我添加了必需的环境变量。 假设
添加:
ORACLE_HOME=/oracle/product/12.1.0/dbhome_1
LD_LIBRARY_PATH=/oracle/product/12.1.0/dbhome_1/lib:/oracle/product/12.1.0/dbhome_1/network/lib:/oracle/product/12.1.0/client/lib
我还补充说:
TNS_ADMIN=/oracle/product/12.1.0/dbhome_1/network/admin
ORACLE_SID=<your sid>
更新/etc/sysconfig/httpd
后,我刚刚重新启动了Apache的服务httpd,就是这样:
$ sudo systemctl restart httpd
我希望它有所帮助!
答案 6 :(得分:0)
我对此php_warning的解决方案如下:
将以下几行添加到httpd配置中,并且该警告消失了。
# cat /etc/sysconfig/httpd |grep -v "#"
LANG=C
ORACLE_HOME=/oracle/product/19
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
错误是: [Wed Dec 02 10:06:27.291278 2020] [:错误] [pid 1744] [客户端127.0.0.1:39610] PHP警告:oci_connect():OCIEnvNlsCreate()失败。您的系统有问题-请检查是否已设置ORACLE_HOME和LD_LIBRARY_PATH,并指向第57行/var/www/html/websrv/ws_reg.php中的正确目录 [Wed Dec 02 10:06:27.291401 2020] [:error] [pid 1744] [client 127.0.0.1:39610] PHP警告:oci_connect():尝试在/ var中检索错误ORA-01804 \ n的文本时出错/www/html/websrv/ws_reg.php,第57行 [Wed Dec 02 10:06:27.291531 2020] [:error] [pid 1744] [client 127.0.0.1:39610] PHP警告:oci_close()期望参数1为资源,/ var / www / html /中为布尔值第588行的websrv / ws_reg.php