编译安装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/lib
)libclntsh.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()); } ?>