Oracle PDO OCI字符集失败

我正在使用即时oracle客户端11.2,PHP 5.5.16从源编译以下configuration参数:

'./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'

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

今天我想把这个服务器configuration从apache移到nginx和fpm。 一切工作正常,除了连接,PDO抛出: OCIEnvNlsCreate: Check the character set is valid and that PHP has access to Oracle libraries and NLS data

我已经得到了完全相同的configuration,除了处理php而不是apxs的php-fpm。

如果我删除charset=UTF8部分它的作品,但显然我得到了字符集错误。 我已经添加到我的php_fpm.conf env[NLS_LANG]=FRENCH_FRANCE.UTF8环境variables没有成功。

我能做些什么来使nginx / php-fpmconfiguration工作?

再读一下oci8安装php页面的注释我已经解决了这个问题。

事实是,即使在php的php文档中提到过,在php_fpm.conf中设置环境变量也是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 . /etc/profile.d/oracle.sh

今天解决了这个问题。 在我的情况下,问题只出现在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多余的