【问题标题】:Oracle PDO OCI charset failingOracle PDO OCI 字符集失败
【发布时间】:2014-10-28 06:21:11
【问题描述】:

我正在使用即时 oracle 客户端 11.2,php 5.5.16,从源代码编译并具有以下配置参数:

'./configure' '--enable-fpm' '--enable-bcmath' '--with-bz2' '--enable-calendar' '--with-curl' '--enable-dba' '--enable-exif' '--enable-ftp' '--with-gd' '--with-gettext' '--with-kerberos' '--enable-mbstring' '--with-mcrypt' '--with-openssl' '--enable-shmop' '--enable-soap' '--enable-sockets' '--enable-sysvmsg' '--enable-wddx' '--enable-zip' '--with-zlib' '--with-xsl' '--with-mysql' '--with-mysqli' '--with-pgsql' '--with-pdo-mysql' '--with-pdo-pgsql' '--with-oci8' '--with-pdo-oci'

在我之前的配置中,我使用 apache2(--with-apxs2=/usr/bin/apxs2 而不是 --enable-fpm)与 oracle 和 oci8。我的数据源名称是:"oci:dbname=//IP:1521/SID;charset=UTF8"。 它工作得很好。

今天我想将此服务器配置从 apache 移动到 nginx 和 fpm。一切正常,除了在连接时,PDO 抛出: OCIEnvNlsCreate: Check the character set is valid and that PHP has access to Oracle libraries and NLS data

我有完全相同的配置,除了 php-fpm 处理 php 而不是 apxs。

如果我删除 charset=UTF8 部分,它可以工作,但显然我遇到了字符集错误。我已将env[NLS_LANG]=FRENCH_FRANCE.UTF8 环境变量添加到我的php_fpm.conf 中,但没有成功。

如何使 nginx/php-fpm 配置正常工作?

【问题讨论】:

    标签: oracle nginx pdo php


    【解决方案1】:

    再次阅读oci8 installation php page 上的评论,我已经解决了这个问题。

    事实是,即使oracle php docs 中提到了这一点,在php_fpm.conf 中设置环境变量也不起作用!

    你必须:

    1. vim /etc/profile.d/oracle.sh写一个oracle特定的配置文件

      #!/bin/bash
      ORACLE_HOME=/usr/lib/oracle/11.2/client64
      C_INCLUDE_PATH=/usr/include/oracle/11.2/client64
      LD_LIBRARY_PATH=$ORACLE_HOME/lib
      #remember this is the client NLS_LANG not the server one
      NLS_LANG=FRENCH_FRANCE.UTF8 
      export ORACLE_HOME LD_LIBRARY_PATH NLS_LANG
      
    2. 将此添加到/etc/init.d/php-fpm . /etc/profile.d/oracle.sh

    【讨论】:

      【解决方案2】:

      今天解决了这个问题。就我而言,问题仅存在于 1 个环境变量中:ORACLE_HOME

      如果我使用 php-cli 运行脚本,那么 ORACLE_HOME 设置为 /usr/lib 并且一切正常,因此 dsn 中的 charset=UTF8 就可以了。

      但是如果我用 php-fpm 运行相同的脚本,那么 ORACLE_HOME 没有设置,只有这就是 dsn 中的 charset=UTF8 中断运行时的原因。

      所以我的解决方案是添加这个:

      putenv('ORACLE_HOME=/usr/lib');
      

      到我的 php 脚本。 不需要设置其他变量。 所以设置NLS_LANGLD_LIBRARY_PATHC_INCLUDE_PATH冗余

      【讨论】:

        【解决方案3】:

        解决了将环境变量添加到 php-fpm.conf 的问题,如下所示:

        ; ORACLE
        env[ORACLE_HOME] = /usr/lib/oracle/12.2/client64
        env[C_INCLUDE_PATH] = /usr/lib/oracle/12.2/client64
        env[LD_LIBRARY_PATH] = /usr/lib/oracle/12.2/client64/lib
        env[NLS_LANG] = AMERICAN_AMERICA.AL32UTF8
        

        【讨论】:

          猜你喜欢
          • 2016-09-03
          • 2018-01-15
          • 2017-04-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多