3

问题:Linux CentOS/Oracle 11g/InstantClient/PHP 5.3.3

错误:oci_connect():OCIEnvNlsCreate() 失败。您的系统有问题 - 请检查 ORACLE_HOME 和 LD_LIBRARY_PATH 是否已设置并指向正确的目录

phpinfo() 相关部分:

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

如您所见,环境变量已正确设置,我可以使用 with 在页面上回显它们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();

我尝试了从谷歌搜索中找到的所有技巧,但没有任何效果。
任何帮助表示赞赏。

4

7 回答 7

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 或您的发行版/版本的任何文件中有环境变量。可以在此处或互联网上的任何地方找到一个简单的指南。为什么?

不要在 PHP 脚本中使用 putenv() 设置 Oracle 环境变量,因为 Oracle 库可能会在脚本运行之前加载和初始化。使用 putenv() 设置的变量可能会导致冲突、崩溃或不可预知的行为。某些功能可能有效,但其他功能可能会产生细微的错误。应在启动 Web 服务器之前设置变量。

如安装文档中所述。之后还要重新启动apache。它是基于发行版/版本的,但很可能命令是service httpd restart.

  1. 重新安装 oci8。尽可能多次。不要强迫它。强迫只会让事情变得更糟。另外,尝试编译它(也就是下载包使用./configure -'all the fancy commands you'll need to use'然后make install)。

  2. 确保你做对了LD_LIBRARY_PATH。说起来很有趣,对吧?您可能没有注意到 oracleclient/lib/N 个不同位置创建了包含或多或少相同文件的文件夹,它们之间的唯一区别是,选择除其中一个文件夹之外的所有文件夹将导致上述错误。完整性检查?

  3. 重新安装 php/apache。您可能有一些导致问题的旧安装。因此,使用apt-get purge php*yum remove php*任何对您的分发有相同作用的方法,将是一个好的开始。

编辑 PHP 升级后问题再次出现,这次使用了不同的解决方案。

  1. 编辑 SYSCONFIG编辑文件 /etc/sysconfig/httpd。在末尾添加这两行:

    导出 LD_LIBRARY_PATH=/path/to.lib 导出 ORACLE_HOME=/path/to/home

  2. 放弃并阅读可在此处找到的手册。

如果这些都没有帮助,请随意浏览悲伤之墙,寻求解决方案......

于 2015-03-18T07:46:49.883 回答
3

我自己也处理过这些相同的问题,并找到了解决方案。

我的解决方案是:

  1. 错误:错误:oci_connect(): OCIEnvNlsCreate() 失败

授予客户端目录和文件的权限:

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 将被授权连接数据库。

于 2015-04-23T18:03:22.330 回答
1

您需要将即时客户端的所有内容复制到 apache/bin

我正在使用 xampp 并为我工作。

将即时客户端的所有文件在此处输入图像描述复制到 apache/bin

于 2018-08-02T20:16:04.993 回答
0

除了在 Ubuntu 系统上,我自己也处理过这些相同的问题。我们通过直接在 /etc/environment 中设置环境变量并将它们排除在 apache 配置之外来解决它。只需在环境文件的底部添加变量,它们就会在系统范围内应用。

于 2013-05-02T19:13:12.837 回答
0

我刚刚解决了同样的问题:

  • 阿帕奇
  • CentOS 7
  • PHP 5
  • 甲骨文 12cR1

消息说:

请检查 ORACLE_HOME 和 LD_LIBRARY_PATH 是否已设置并指向正确的目录

在apache中,有一个文件可以设置环境变量: /etc/sysconfig/httpd. nginx 必须有一个配置文件。

我添加了所需的环境变量。假如说

  • ORACLE_HOME 是/oracle/product/12.1.0/dbhome_1
  • Oracle 客户端安装在/oracle/product/12.1.0/client下

添加 :

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

我希望它有帮助!

于 2017-08-24T14:06:56.513 回答
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] [:error] [pid 1744] [client 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 Warning: oci_connect(): Error while trying to retrieve text for error ORA-01804\n in /var/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 中给出布尔值/websrv/ws_reg.php 在第 588 行

于 2020-12-02T11:08:24.383 回答
0

在 apache 初始化脚本上添加您的自定义环境变量。我使用的是centos,所以初始化脚本位于/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

希望这有帮助

于 2015-11-14T12:43:31.703 回答