繁体   English   中英

Oracle PDO OCI字符集失败

[英]Oracle PDO OCI charset failing

我正在使用具有以下configure参数从源代码编译的即时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部分,它可以工作,但是显然我遇到了charset错误。 我没有成功将env[NLS_LANG]=FRENCH_FRANCE.UTF8环境变量添加到我的php_fpm.conf

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

再次阅读oci8安装php页面上的注释,我已经解决了这个问题。

事实是,即使在oracle php文档中提到了这一点,在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多余的

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM