centos7.5 php oracle client oci8 配置

首先我的centos版本是7.5,oracle 连接远程的,所以这里没有安装oracle 的教程

我是php php-fpm都是通过yum安装的,php默认版本5.4

几个小时的操作,出错浓缩成几句话

一:去 http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html

或者我用的版本https://download.csdn.net/download/wq57885/10511204

下载适合自己的,2018-7-1我下载的是

oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm

oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm

二:传到linux上,我的是虚拟机

我传到root下,然后执行命令

rpm -ivh oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm 
rpm -ivh oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm

更新全局变量,首先vi进入文件

vi etc/profile

文件末尾加入

export ORACLE_HOME=/usr/lib/oracle/12.2/client64
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export NLS_LANG="AMERICAN_AMERICA.ZHS16GBK"
立即生效环境变量
source /etc/profile

三:这里开始是坑,直接拉到最后从第四步看起,直接跳过第三部,不然会出现乱码问题,无法解决.留着只是让你看看这个操蛋玩意花了我几天的时间

本来我是按网上来的去

https://pecl.php.net/package/oci8 上下载安装,奈何出现了

checking Oracle Instant Client SDK header directory... configure: error: Oracle Instant Client SDK header files not found

最后在页面上看到,虽然看不懂英文,但是代码是无国界的

好的明白了,

首先没有安装pecl命令的先安装,安装了的直接跳过这步

yum install php-pear php-devel

然后安装oci8

C_INCLUDE_PATH=/usr/include/oracle/12.2/client64 pecl install oci8-1.4.10

一路回车

最后看见

You should add "extension=oci8.so" to php.ini

Vi /etc/php.ini

加入 

extension=oci8.so

重启php-fpm

service php-fpm restart

通过phpinfo看见安装成功

到这里有完结了吗?NONONO,太年轻了,少年。才刚刚开始,这篇文章虽短,FUCK,搞了我五六个小时。

tp5显示依然显示错误could not find driver,为什么?

因为它用的pdo,还少一个:pdo_oci.so

去 https://pecl.php.net/package/PDO_OCI 下载PDO_OCI-1.0.tgz

可以wget,我这里是通过win7下载上传到虚拟机里

我的下载地址https://download.csdn.net/download/wq57885/10511343

解压包

tar -xvf PDO_OCI-1.0.tgz

首先需要在包的config.m4里加两行代码

Find a pattern like this near line 10 and add these 2 lines:

elif test -f $PDO_OCI_DIR/lib/libclntsh.$SHLIB_SUFFIX_NAME.12.1; then
PDO_OCI_VERSION=12.2

Find a pattern like this near line 101 and add these lines:

12.2)
  PHP_ADD_LIBRARY(clntsh, 1, PDO_OCI_SHARED_LIBADD)
  ;;

在pdo_oci.c文件中

    将 function_entry 改成 zend_function_entry

提前解决后面编译会出现的(这步花了若干时间,google到的方法)

/usr/bin/ld: cannot find -lclntsh

collect2: error: ld returned 1 exit status

cd /usr/lib
ln -s $ORACLE_HOME/lib/libclntsh.so libclntsh.so

进入PDO_OCI-1.0目录下,我这里省略命令

 /usr/bin/phpize
 ./configure --with-pdo-oci=instantclient,/usr,12.2  
 make && make install  
 echo "extension=pdo_oci.so" > /etc/php.d/pdo_oci.ini  
 service php-fpm restart
搞定



最后还有一个乱码的坑,

因为oracle安装在windows服务器上,php在linux上,目前暂无解决

四:跳到这里后,第三步全部推翻,oci和pdo_oci必须从你所对应的php版本源码包里下载,编译过程我就不讲了网上一堆资料,我是重新做了环境,选了php5.6扩展oci和pdo_oci一起编译,这样出来的oci和pdo_oci才不会有乱码问题,

这里的中文乱码问题是指和服务端设置一样的NLS_LANG也无法解决的乱码,乱码部分全是???

服务端oracle执行sql

select userenv('language') from dual

我这里是AMERICAN_AMERICA.ZHS16GBK,

etc/profile文件的NLS_LANG和服务端的保持一致。

然后打开自己的项目php页面会提示

SQLSTATE[HY000]: OCIEnvNlsCreate: Check the character set is valid and that PHP has access to Oracle libraries and NLS data (/root/php-5.6.36/ext/pdo_oci/oci_driver.c:614)

原因是:source导入/etc/profile的用户是vagrant,而启动php-fpm使用了sudo

所以php-fpm也要设置下oracle client的环境变量

找到php-fpm.conf所在文件位置,我这里是自己编译的,在/usr/local/php/etc下

找到;env[HOSTNAME] = $HOSTNAME在;env[TEMP] = /tmp后加入

env[ORACLE_HOME]=/usr/lib/oracle/12.2/client64/lib
env[LD_LIBRARY_PATH]=/usr/lib/oracle/12.2/client64/lib

这里很奇怪ORACLE_HOME和上面profile的ORACLE_HOME不一样

service php-fpm restart

大功告成,久违的thinkphp5完美链接oracle无乱码出来了





发布了51 篇原创文章 · 获赞 17 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/wq57885/article/details/80871740