【问题标题】:Oracle 11g PHP oci_connect fails OCIEnvNlsCreate()Oracle 11g PHP oci_connect 失败 OCIEnvNlsCreate()
【发布时间】:2020-12-02 19:08:24
【问题描述】:

问题: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();

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

【问题讨论】:

    标签: php oracle


    【解决方案1】:

    获得 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() 设置的变量可能会导致冲突, 崩溃或不可预测的行为。某些功能可能有效,但其他功能 可能会出现细微的错误。变量应该在之前设置 网络服务器已启动。

    如安装文档中所述。之后还要重新启动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,寻求解决方案...

    【讨论】:

    • 我能够解决这个问题,因为在 /etc/sysconfig/httpd 中导出了环境变量 ORACLE_HOME 和 LD_LIBRARY_PATH 以便 apache 可以选择它。
    【解决方案2】:

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

    我的解决方案是:

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

    【讨论】:

      【解决方案3】:

      你需要将instant client的所有内容复制到apache/bin

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

      将即时客户端enter image description here的所有文件复制到apache/bin

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 感谢您的回复,我试过了,但对我的情况没有帮助。
        【解决方案5】:

        在 apache 初始化脚本上添加您的自定义环境变量。 我用的是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
        

        希望对你有所帮助

        【讨论】:

          【解决方案6】:

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

          • 阿帕奇
          • CentOS 7
          • PHP 5
          • Oracle 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
          

          希望对你有帮助!

          【讨论】:

            【解决方案7】:

            我对此 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
            

            错误是: [2020 年 12 月 2 日星期三 10:06:27.291278] [: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 中的正确目录 [2020 年 12 月 2 日星期三 10:06:27.291401] [: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/ 中给出websrv/ws_reg.php 第 588 行

            【讨论】:

              猜你喜欢
              • 2020-10-20
              • 2016-05-23
              • 1970-01-01
              • 2020-06-02
              • 2013-01-16
              • 2012-04-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多