PHP 连接到 Oracle 数据库和 PHP 连接 Mysql 类似,都需要安装对应的 pdo 驱动,但在安装 Oracle 的扩展时经常会出现问题,故记之。
PDO_OCI 扩展可以在 PHP 源码中 ext/pdo_oci
中安装,也可以在 pecl 扩展库中下载安装。pecl 中扩展已经不在维护,所以需要修改编译的文件(config.m4)。
PDO_OCI 扩展安装前,需要先安装 oci8 扩展和 Oracle Instantclient客户端。Oracle Instantclient 提供连接本地或者远程 Oracle 数据库的功能。
准备
- 下载 Oracle Instantclient ,包括2个文件:Basic、SDK 。下载你机器对应的版本。地址:http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html
我下载的文件是
instantclient-basic-linux.x64-12.2.0.1.0.zip
instantclient-sdk-linux.x64-12.2.0.1.0.zip
- 下载 oracle 数据库的扩展 oci8。
https://pecl.php.net/package/oci8
安装 Oracle Instantclient
解压 Oracle Instantcient ,并创建必要的软连接(注意你下载的文件的版本,可能与文章的不同)。
mkdir -p /opt/oracle
mv ~/downloads/instantclient-*.zip /opt/oracle/
cd /opt/oracle
unzip instantclient-basic-linux.x64-12.2.0.1.0.zip
unzip instantclient-sdk-linux.x64-12.2.0.1.0.zip
sudo mv instantclient_12_2 instantclient
cd instantclient
sudo ln -s /opt/oracle/instantclient/libclntsh.so.12.1 /opt/oracle/instantclient/libclntsh.so
sudo ln -s /opt/oracle/instantclient/libocci.so.12.1 /opt/oracle/instantclient/libocci.so
sudo ln -s /opt/oracle/instantclient/ /opt/oracle/instantclient/lib
sudo mkdir -p include/oracle/12.2/
cd include/oracle/12.2/
sudo ln -s ../../../sdk/include client
cd -
sudo mkdir -p lib/oracle/12.2/client
cd lib/oracle/12.2/client
sudo ln -s ../../../ lib
cd -
mkdir -p /opt/oracle/instantclient/lib/oracle/12.2
ln -s /opt/oracle/instantclient/sdk /opt/oracle/instantclient/lib/oracle/12.2/client
ln -s /opt/oracle/instantclient /opt/oracle/instantclient/lib/oracle/12.2/client/lib
echo /opt/oracle/instantclient/ | sudo tee -a /etc/ld.so.conf.d/oracle.conf
sudo ldconfig
sudo apt-get install libaio1
安装 oci8 扩展
需要先安装 oci8,才能安装 pdo_oci。
sudo tar -xvzf oci8-2.0.12.tgz
cd oci8-2.0.12
sudo /usr/local/bin/phpize
sudo ./configure --with-oci8=instantclient,/opt/oracle/instantclient/ --with-php-config=/usr/bin/php-config5.6
sudo make
sudo make install
安装 pdo_oci 扩展
进入 php 源码的 ext/pdo_oci 文件夹
sudo /usr/local/bin/phpize
sudo ./configure --with-pdo-oci=instantclient,/opt/oracle/instantclient,12.2 --with-php-config=/usr/local/bin/php-config
sudo make
sudo make install
echo extension=pdo_oci.so | sudo tee -a /etc/php5.6.32/conf.d/pdo_oci.ini
使用 PDO_OCI 扩展包安装
在 pecl 中下载最新的扩展包。
tar xvf PDO_OCI-1.0.tgz
cd PDO_OCI-1.0
在扩展包中 config.m4 文件中添加(查询关键字PDO_OCI_VERSION、PHP_ADD_LIBRARY):
elif test -f $PDO_OCI_DIR/lib/libclntsh.$SHLIB_SUFFIX_NAME.12.2; then
PDO_OCI_VERSION=12.2
12.2)
PHP_ADD_LIBRARY(clntsh, 1, PDO_OCI_SHARED_LIBADD)
;;
修改扩展包中 pdo_oci.c 文件:
sed -i -e 's/function_entry pdo_oci_functions/zend_function_entry pdo_oci_functions/' pdo_oci.c
继续安装,步骤与在源码的扩展中安装一致。
使用
<?php
$db_username = "youusername";
$db_password = "yourpassword";
$db = "oci:dbname=yoursid";
try {
$conn = new PDO($db,$db_username,$db_password);
} catch (\PDOException $e) {
echo ($e->getMessage());
}
连接正常。
https://stackoverflow.com/questions/21936091/how-to-install-oracle-instantclient-and-pdo-oci-on-ubuntu-machine
https://shiki.me/blog/installing-pdo_oci-and-oci8-php-extensions-on-centos-6-4-64bit
http://php.net/manual/en/ref.pdo-oci.php
https://shiki.me/blog/installing-pdo_oci-and-oci8-php-extensions-on-centos-6-4-64bit