首先我的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无乱码出来了