欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

linux系统下php通过php_oci8扩展连接oracle数据库笔记

程序员文章站 2022-04-28 16:11:57
...
php连接oracle并不像连接mysql那么简单,多数情况是用不到它的,但是如果碰到需要用php访问oracle数据库的情况,就很棘手了。

大致步骤如下:

我的环境是linux系统(centos 6.7 64位),安装wdcp面板,其中php的版本是5.3,以下为从网上搜到的解决办法,但是中间也有一些坑,稍后我会填上:注意看by:sunfei的部分

1. 安装InstantClient

instantclient是oracle的连接数据库的简单客户端,不用安装一个500Moracle客户端就可以连接oracle数据库,有windows和linux版本。从 这里选择需要的版本下载,只需Basic和Devel两个rpm包。

第一个坑:这里下载的话最好是要注册一个oracle官方的账号,下载时提示登录,登录后再下载就可以,因为我之前直接下载了好几次,安装都出错,因为下载的其实是个网页,而不是真正的rpm包。(by:sunfei)

安装# rpm -ivh oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm# rpm -ivh oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm软链接# ln -s /usr/include/oracle/11.2/client64 /usr/include/oracle/11.2/client# ln -s /usr/lib/oracle/11.2/client64 /usr/lib/oracle/11.2/client

64位系统需要创建32位的软链接,这里可能是一个遗留bug,不然后面编译会出问题。

接下来还要让系统能够找到oracle客户端的库文件,修改LD_LIBRARY_PATH:

# vi /etc/profile.d/oracle.shexport ORACLE_HOME=/usr/lib/oracle/11.2/client64export LD_LIBRARY_PATH=$ORACLE_HOME/lib

执行 source /etc/profile.d/oracle.sh使环境变量生效。

2. 安装PDO_OCI

这里我并没有安装这个扩展,我只安装了oci8,直接看第三步(by:sunfei)

在连接互联网的情况下,通过pecl在线安装php的扩展非常简单,参考 How to install oracle instantclient and pdo_oci on ubuntu machine。

从 https://pecl.php.net/package/PDO_OCI下载 PDO_OCI-1.0.tgz 源文件。

# wget https://pecl.php.net/get/PDO_OCI-1.0.tgz# tar -xvf PDO_OCI-1.0.tgz# cd PDO_OCI-1.0

由于PDO_OCI很久没有更新,所以下面需要编辑 ODI_OCI-1.0文件夹里的 config.m4文件来让它支持11g:

# 在第10行左右找到与下面类似的代码,添加这两行:elif test -f $PDO_OCI_DIR/lib/libclntsh.$SHLIB_SUFFIX_NAME.11.2; then  PDO_OCI_VERSION=11.2# 在第101行左右添加这几行:11.2)  PHP_ADD_LIBRARY(clntsh, 1, PDO_OCI_SHARED_LIBADD)  ;;

编译安装pdo_oci扩展:(安装完成后可在 /usr/lib64/php/modules/pdo_oci.so 找到这个模块)

$ phpize$ ./configure --with-pdo-oci=instantclient,/usr,11.2$ make$ sudo make install

要启用这个扩展,在 /etc/php.d/下新建一个 pdo_oci.ini文件,内容:

extension=pdo_oci.so

验证安装成功:

# php -i|grep oci看到类似下面的内容则安装成功:/etc/php.d/pdo_oci.ini,PDO drivers => oci, sqlite或# php -m

3. 安装OCI8

从 https://pecl.php.net/package/oci8下载oci8-2.0.8.tgz源文件。

第二个坑:这里要先进入到wdcp面板的php扩展目录/www/wdlinux/php/include/php/ext,然后下载,解压(by:sunfei)

# wget https://pecl.php.net/get/oci8-2.0.8.tgz# tar -xvf oci8-2.0.8.tgz# cd oci8-2.0.8

编译安装oci8扩展:

第三个坑:下面的phpize在wdcp面板下直接输入是找不到的,所以要用完整路径

/www/wdlinux/php/bin/phpize

同样的原因,php-config也找不到的,所以要在配置行加上下面的代码,加到…./client64/lib的后面就行了,注意,要先空格–with-php-config=/www/wdlinux/php/bin/php-config

# phpize# ./configure --with-oci8=shared,instantclient,/usr/lib/oracle/11.2/client64/lib# make# make install

要启用这个扩展,在 /etc/php.d/下新建一个 oci8.ini文件,内容:

第四个坑:上一步的make install完成后,屏幕显示一个路径出来,这个路径就是oci8.so文件的位置,文件有了,然后还得到php.ini中去增加配置,wdcp面板php.ini的路径在/www/wdlinux/etc/php.ini,到配置文件的最后,加上一行extension=/www/wdlinux/apache_php-5.3.29/lib/php/extensions/no-debug-non-zts-20090626/oci8.so,我是加到了zend相关配置的前面,因为有人说加到最后不行,你可以自己试试。然后重启apache,到此为止,你基本上就算成功了。(by:sunfei)

extension=oci8.so

验证安装成功:

# php -i|grep oci8/etc/php.d/oci8.ini,oci8oci8.connection_class => no value => no valueoci8.default_prefetch => 100 => 100oci8.events => Off => Offoci8.max_persistent => -1 => -1oci8.old_oci_close_semantics => Off => Offoci8.persistent_timeout => -1 => -1oci8.ping_interval => 60 => 60oci8.privileged_connect => Off => Offoci8.statement_cache_size => 20 => 20OLDPWD => /usr/local/src/oci8-2.0.8_SERVER["OLDPWD"] => /usr/local/src/oci8-2.0.8

最后别忘了重启逆web服务器如apache,可以通过phpinfo()来确保扩展是否成功安装。

4. 测试连接

在你web服务器如apache的php目录下创建 testoci.php:

第五个坑:下面这段代码里,显示$item的部分,不知道为什么要用htmlentities函数去处理一下,我第一次没有发现,后来发现中文乱码的时候,才上网查询,最后把这个函数去掉了,直接显示$item,另外还要在oci_connect参数里加上编码参数ZHS16GBK(如果不行换编码,百度,我就不写了)。(by:sunfei)

\n";while (($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) != false) { echo "\n"; foreach ($row as $item) { echo " ".($item !== null ? htmlentities($item, ENT_QUOTES) : " ")."\n"; } echo "\n";}echo "\n";?>

访问这个页面就应该可以得到结果了。

终极大坑:你可能执行上面的页面后发现没有任何东西显示,你可以在连接完的那一行后面显示一下oci的错误信息,具体用oci_error(),发现ora-24408 could not generate unique server group name是这个错误,百度了很久,找到了解决方法,/etc/sysconfig/network这里要配置HOSTNAME=主机名(主机名是自己起的名字),同时要在/etc/hosts里随后添加(127.0.0.1 localhost的后面,加个空格然后添加)主机名,然后重启网络service network restart,再去跑上面的测试文件,就OK了。(by:sunfei)

总算是解决问题了,可能你在实际过程中又会遇到其他问题,还是不成功,我只能说,慢慢来,总会解决的,记得解决后把经验发上来,以供新(cai)手(niao)学习。