[英]Oracle 11g PHP oci_connect fails OCIEnvNlsCreate()
问题:Linux CentOS/Oracle 11g/InstantClient/PHP 5.3.3
错误:oci_connect():OCEInvNlsCreate() 失败。 您的系统有问题 - 请检查 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();
我尝试了从谷歌搜索中找到的所有技巧,但没有任何效果。
任何帮助表示赞赏。
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 或您的发行版/版本的任何文件中有为环境变量。 可以在此处或互联网上的任何地方找到简单的指南。 为什么?
不要在 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。 在最后添加这两行:
导出 LD_LIBRARY_PATH=/path/to.lib 导出 ORACLE_HOME=/path/to/home
放弃并阅读可在此处找到的手册。
我自己也处理过这些相同的问题,并找到了解决方案。
在我的情况下的解决方案是:
授予对客户端目录和文件的权限:
sudo chmod -R 777 /usr/lib/oracle/11.2/client64
和
sudo chmod -R 777 /usr/include/oracle/11.2/client64
2.我后来得到的错误:ORA-12546: TNS:permission denied
setsebool -P httpd_can_network_connect 1
Apache 将被授权连接数据库。
除了在 Ubuntu 系统上,我自己也处理过这些相同的问题。 我们通过直接在 /etc/environment 中设置环境变量并将它们排除在 apache 配置之外来解决它。 只需在环境文件底部添加变量,它们就会在系统范围内应用。
在 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
希望这有帮助
我刚刚解决了同样的问题:
消息说:
请检查 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
我希望它有帮助!
我对此 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] [:error] [pid 1744] [client 127.0.0.1:39610] PHP 警告:oci_connect(): OCIEnvNlsCreate() 失败。 您的系统有问题 - 请检查 ORACLE_HOME 和 LD_LIBRARY_PATH 是否已设置并指向第 57 行 [Wed Dec 02 10:06:27.291401 2020] [/var/www/html/websrv/ws_reg.php] 中的正确目录:error] [pid 1744] [client 127.0.0.1:39610] PHP 警告: oci_connect(): 尝试检索文本时出错 ORA-01804\\n in /var/www/html/websrv/ws_reg.php on line 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 中给出/websrv/ws_reg.php 第 588 行
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.