Oracle PDO OCI charset失败

时间:2014-09-03 16:42:33

标签: oracle nginx pdo php

我正在使用即时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部分它可以工作,但显然我遇到了字符集错误。我已添加到php_fpm.conf env[NLS_LANG]=FRENCH_FRANCE.UTF8环境变量中,但未成功。

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

3 个答案:

答案 0 :(得分:2)

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

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

你必须:

  1. 将特定于oracle的个人资料写入vim /etc/profile.d/oracle.sh

    #!/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

答案 1 :(得分:1)

今天解决了这个问题。就我而言,问题只出现在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 多余

答案 2 :(得分:0)

解决了将环境变量添加到 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