我正在使用即时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配置正常工作?
答案 0 :(得分:2)
再次阅读关于oci8 installation php page的评论,我已经解决了这个问题。
事实是,即使在oracle php docs中提及,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
答案 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_LANG
,LD_LIBRARY_PATH
或C_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