我正在使用即时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
!
你必须:
写一个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
将其添加到/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_LANG
, LD_LIBRARY_PATH
或C_INCLUDE_PATH
是多余的 。