博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编译安装PDO_OCI支持ORACLE 12c
阅读量:7061 次
发布时间:2019-06-28

本文共 5349 字,大约阅读时间需要 17 分钟。

  hot3.png

编译安装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 PDO_OCI-1.0]# ln -s /usr/include/oracle/12.2 /usr/include/oracle/10.2.0.3

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

[root 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 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 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)

在连接互联网的情况下,通过pecl在线安装php的扩展非常简单,参考  。

从  下载 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和12c:

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

$SHLIB_SUFFIX_NAME就是so

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

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

  PDO_OCI_VERSION=11.2

 

elif test -f $PDO_OCI_DIR/lib/libclntsh.$SHLIB_SUFFIX_NAME.12.1 then

  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 = new PDO('oci:dbname=IP地址:端口号/SID',用户名,密码);

报错:

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

改成下面这种连接方式:

这样就没问题了。

<?php

$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());
}
?>

转载于:https://my.oschina.net/grail/blog/891795

你可能感兴趣的文章
解决开启服务器防火墙导致ftp不能连接的问题
查看>>
程序员网站
查看>>
p2v-VMware vCenter Converter Standalone 5.0
查看>>
在Windows平台上绿色安装postgresQL
查看>>
POJ 3617 Best Cow Line(贪心 字典序最小)
查看>>
oracle表中某个字段含有字符回车、空格的手动修改方式
查看>>
常用数学符号大全
查看>>
NGUI 学习笔记实战之二——商城数据绑定(Ndata)
查看>>
无法使用SQL Server Management Studio的找到Network Server
查看>>
kafka 遇到的错
查看>>
GIL - global interpreter lock
查看>>
MySQL笔记-最简单的方法来解决找不到mysqld.sock文件的问题
查看>>
securecrt中文乱码
查看>>
[转]Android获取、设置铃声,音量,静音,扬声器
查看>>
放大器(或集线器)模式(Hub)
查看>>
Web Part的Scope问题
查看>>
ToDoList
查看>>
在idea下两个项目之间的maven父子级项目依赖
查看>>
关于 js 对象 转 字符串 和 深拷贝 的探讨
查看>>
智能识别收货地址 javascript
查看>>