php - Oracle 11g PHP oci_connect 失败 OCIEnvNlsCreate()

标签 php oracle

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

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

phpinfo() 相关部分:

enter image description here

enter image description here

enter image description here

如您所见,环境变量已正确设置,我可以使用 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() 失败了吗?欢迎来到 hell ...

我知道线程是旧的,但问题仍然存在。通常这个问题的答案会重定向到第三方站点,通常是 404s。

让我们从问题开始。错误本身非常普遍。它的文档总结为“lib crashed...dunno why”。有多种解决方案,包括但不限于配置、重新安装和祈祷“在此处插入随机神名”。

以下是最常见解决方案的简短列表:

<强>1。将变量放入您的 .php 文件中。

    putenv("LD_LIBRARY_PATH=$newld");

where $newld is the link to your library.

<强>2。删除变量 LD_LIBRARY_PATH,如果存在(是的,它在 1. 中显示的方式),从您的 php 文件并将其放入您的 apache2.conf 或 httpd.conf 或/etc/environment 或您的发行版的任何文件/version 用于环境变量。可以找到一个简单的指南 here或互联网上的任何地方。为什么?

Do not set Oracle environment variables using putenv() in a PHP script because Oracle libraries may be loaded and initialized before your script runs. Variables set with putenv() may then cause conflicts, crashes, or unpredictable behavior. Some functions may work but others might give subtle errors. The variables should be set up before the web server is started.

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

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

  2. 确保您获得了正确的 LD_LIBRARY_PATH。有趣的是,对吧?您可能没有注意到 oracle 在 N 个不同的位置 创建了文件夹 client/lib/,其中包含或多或少相同的文件,它们之间唯一的区别是,是选择除其中一个以外的所有文件夹都会导致上述错误。完整性检查?

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

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

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

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

  2. 放弃并阅读手册可以找到here .

如果这些都没有帮助,请随时浏览 wall of sorrow , 一个解决方案...

关于php - Oracle 11g PHP oci_connect 失败 OCIEnvNlsCreate(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16345515/

相关文章:

php - 与 codeigniter(php 框架)一起使用的最佳 ORM 是什么?为什么?

php - Mysql删除重复行的方法

php - 使用 codeigniter 进行子查询

sql - PL SQL - 将时间戳转换为日期时间/日期

sql - 使用不同的日期值更新 Oracle 日期列

sql - 搜索 Oracle CLOB 列的最佳方法是什么?

java - 如何使用php解码图像文件

php - 访问返回数组

oracle - 创建约束时,Exceptions into 子句不起作用

sql - 使用 Oracle 11g 中列值的更改从选择中更新/创建表(加速)