php oci8 12c.so,编译安装PDO_OCI支持ORACLE 12c

编译安装PDO_OCI

新源码:php-5.6.30\ext\pdo_oci (建议)

需要单独编译,不能和PHP一起编译

编译安装

instantclient-sdk-linux.x64-12.2.0.1.0 的INCLUDE中的文件COPY到include目录下(或者做个软连接也行)

/usr/local/php/bin/phpize

./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-oci=shared,instantclient ,12.2

旧PDO_OCI代码支持新版方式(参考度娘)

不推荐这个方式。

防止pdo_oci对oracle11支持不足(pdo_oci可能不支持oracle11g,需要做个软链接成作为oracle10版本才能编译过去):

[root@ZF PDO_OCI-1.0]# ln -s /usr/include/oracle/12.2 /usr/include/oracle/10.2.0.3

[root@ZF PDO_OCI-1.0]# ln -s /usr/lib/oracle/12.2 /usr/lib/oracle/10.2.0.3

[root@ZF PDO_OCI-1.0]# /usr/local/php/bin/phpize   用phpize来扩展

Configuring for:

PHP Api Version:         20090626

Zend Module Api No:      20090626

Zend Extension Api No:   220090626

[root@ZF PDO_OCI-1.0]# ./configure --with-php-config=php-config --with-pdo-oci=instantclient,/usr,10.2.0.3

注:--with-pdo-oci这里也可以写全路径,可通过./configure --help查看具体用法

[root@ZF PDO_OCI-1.0]# make

......

Libraries have been installed in:

/usr/local/src/PDO_OCI-1.0/modules

......

[root@ZF PDO_OCI-1.0]# make install

Installing shared extensions:     /usr/lib64/php/modules/

[root@ZF PDO_OCI-1.0]# ll /usr/lib64/php/modules/ |grep pdo_oci.so

-rwxr-xr-x 1 root root  115420 Nov  6 17:32 pdo_oci.so   模块已经加载到php中

[root@ZF PDO_OCI-1.0]#vi /etc/php.ini配置文件中加入

extension=pdo_oci.so       或者在/etc/php.d/下新建个pdo_oci.ini,添加进去

PHP源码中的pdo-oci代码支持11/12版本

修改config.m4支持oracle 11/12版本

SUPPORTED_LIB_VERS="9.0 10.1 11.1 12.1 "  # The lib vers are not bumped when the DB version is bumped

改成

SUPPORTED_LIB_VERS="9.0 10.1 11.1 12.1 12.2"  # The lib vers are not bumped when the DB version is bumped

PDO_OCI_IC_PREFIX="`echo $PDO_OCI_DIR | cut -d, -f2`"

PDO_OCI_IC_VERS="`echo $PDO_OCI_DIR | cut -d, -f3`"

改成:

PDO_OCI_IC_PREFIX="`echo $PDO_OCI_DIR | cut -d, -f1`"

PDO_OCI_IC_VERS="`echo $PDO_OCI_DIR | cut -d, -f2`"

if test "$PHP_PDO_OCI" = "yes" || test -z "$PHP_PDO_OCI"; then

PDO_OCI_DIR=$ORACLE_HOME

else

PDO_OCI_DIR=$PHP_PDO_OCI

Fi

改成

if test "$PHP_PDO_OCI" = "yes" || test -z "$PHP_PDO_OCI"; then

PDO_OCI_DIR=$PHP_PDO_OCI

else

PDO_OCI_DIR=$ORACLE_HOME

Fi

case $PDO_OCI_VERSION in

9.0|10.1|10.2|11.1|11.2|12.1)

改成

case $PDO_OCI_VERSION in

9.0|10.1|10.2|11.1|11.2|12.1|12.2)

旧代码中支持11/12版本(参考度娘)

修改config.m4支持11/12版本

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

# 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和12c:

查看instant client packages的安装位置(/usr/lib/oracle/12.2/client64/lib)libclntsh.so.XX.XX 后面带的版本号对应是12.1不是12.2,注意一下。

$SHLIB_SUFFIX_NAME就是so

#在第10行左右找到与下面类似的代码,添加这两行:

eliftest-f$PDO_OCI_DIR/lib/libclntsh.$SHLIB_SUFFIX_NAME.11.2;then

PDO_OCI_VERSION=11.2

eliftest-f$PDO_OCI_DIR/lib/libclntsh.$SHLIB_SUFFIX_NAME.12.1then

PDO_OCI_VERSION=12.2

#在第101行左右添加这几行:

11.2)

PHP_ADD_LIBRARY(clntsh, 1, PDO_OCI_SHARED_LIBADD)

;;

12.2)

PHP_ADD_LIBRARY(clntsh, 1, PDO_OCI_SHARED_LIBADD)

;;

40行左右:

if test "$PHP_PDO_OCI" = "yes" -o -z "$PHP_PDO_OCI"; then

PDO_OCI_DIR=$ORACLE_HOME

else

PDO_OCI_DIR=$PHP_PDO_OCI

Fi

改成

if test "$PHP_PDO_OCI" = "yes" -o -z "$PHP_PDO_OCI"; then

PDO_OCI_DIR=$PHP_PDO_OCI

else

PDO_OCI_DIR=$ORACLE_HOME

fi

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

$ /usr/local/php/bin/phpize

$./configure--with-php-config=/usr/local/php/bin/php-config--with-pdo-oci=instantclient,/usr,12.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

这个编译选项会产生:checking for oci.h... configure: error: I'm too dumb to figure out where the include dir is in your instant client install

./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-oci=shared,instantclient, 12.2

configure: error: Unsupported Oracle version! 12.2 编译配置文件中 config.m4 会判断 libclntsh的版本

注意libclntsh的版本是12.1不是12.2

checking for oci.h... configure: error: I'm too dumb to figure out where the include dir is in your instant client install

config.m4 会判断 AC_MSG_CHECKING([for oci.h])的版本?

[root@localhost PDO_OCI-1.0]# make

/opt/softwares/php-oracle/PDO_OCI-1.0/pdo_oci.c:34: 错误:expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘pdo_oci_functions’

function_entry pdo_oci_functions[] = {

{NULL, NULL, NULL}

};

改为:

const zend_function_entry pdo_oci_functions[] = {

{NULL, NULL, NULL}

};

/opt/softwares/php-oracle/PDO_OCI-1.0/pdo_oci.c:56: 错误:‘pdo_oci_functions’未声明(不在函数内)

PDO_OCI-1.0/pdo_oci.c查看:

第34生和56行,更改第34行 为const zend_function_entry pdo_oci_functions[] =

[root@localhost PDO_OCI-1.0]# make install

配置

php.ini 里添加

extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/pdo_oci.so

使用篇

(参考度娘)

使用过程跟pdo差不多,我对oracle还不是很了解,但是也遇到一个故障,那就是无法连接oracle。

一开始通过下面的方式连接:

$pdh =newPDO('oci:dbname=IP地址:端口号/SID',用户名,密码);

报错:

SQLSTATE[HY000]:pdo_oci_handle_factory:ORA-12514:TNS:listener does not currently know of service requestedinconnect descriptor

改成下面这种连接方式:

这样就没问题了。

$tns = "

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = yourip)(PORT = 1521))

)

(CONNECT_DATA =

(SERVICE_NAME = orcl)

)

)

";

$db_username = "youname";

$db_password = "yourpassword";

try{

$conn = new PDO("oci:dbname=".$tns,$db_username,$db_password);

}catch(PDOException $e){

echo ($e->getMessage());

}

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值