工作原因,需要使用oracle数据库,从网上找了一圈资料,很多都是下载PDO_OCI-1.0.tgz去编译,当然,他们是在php5.3-5.6环境下进行的。可是php7.2这套路子就不行了,因为7.2的PDO版本太高了,导致即便使用上面的方法编译出来的pdo_oci.so也是无法使用的。经过一番折腾,发现,原来php7.2源码包扩展目录下自带了pdo_oci的源码,直接编译就OK了,害的我走了那么多弯路.
接下来我们先安装oci8扩展:
Step 1
Download the Oracle Instant Client and SDK from Oracle website. (Need to login in Oracle page)
Instant Client for Linux x86-64 (64-bit)
Files: instantclient-basic-linux.x64-12.2.0.1.0.zip
and instantclient-sdk-linux.x64-12.2.0.1.0.zip
.
Step 2
Create a new folder to store Oracle Instant Client zip files on your server.
Upload the Instant Clients files inside this folder.
mkdir /opt/oracle
Step 3
Now we need to extract the files.
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
Step 4
Next, we need to create a symlink to Instant Client files.
ln -s /opt/oracle/instantclient_12_2/libclntsh.so.12.1 /opt/oracle/instantclient_12_2/libclntsh.so ln -s /opt/oracle/instantclient_12_2/libocci.so.12.1 /opt/oracle/instantclient_12_2/libocci.so
Step 5
Add the folder to our ldconfig
.
echo /opt/oracle/instantclient_12_2 > /etc/ld.so.conf.d/oracle-instantclient
Step 6
Update the Dynamic Linker Run-Time Bindings
ldconfig
Done. Now we can proceed to the next part.
浏览器打开可以看到oci8扩展安装成功!
可以看到已经安装成功了
接下来安装PDO_OCI扩展:
php官方扩展库里面是老版本的也就是只支持PHP5.*的版本,我们去官方下载PHP新版本,里面包含有 PDO_OCI扩展:
git clone https://github.com/php/php-src.git
进入扩展里面:
cd php-str/ext/pdo_oci
切换到当前PHP的版本分支,我当前php版本是7.2:
git checkout PHP-7.2
/usr/bin/phpize7.2
设置编译参数,oci8的安装位置:
./configure --with-php-config=/usr/bin/php-config7.2 --with-pdo-oci=instantclient,/home/vagrant/oracle/instantclient_12_1
sudo make
sudo make install
在php.ini添加so文件并重启php:
可以看到扩展已经生成:
浏览器打开可以看到PDO_OCI扩展安装成功!
接下来我们用yii查询oracle,看看是否能查询正常:
先再yii config的public文件里面增加oracle连接配置信息:
'oci'=>array(
'class'=>'CDbConnection',
'connectionString' => 'oci:dbname=//192.168.0.200:3021/orcl;charset=UTF8',
'emulatePrepare' => true,
'username' => 'lch',
'password' => 'lch8888',
),
接着我们写一个sql查询语句:
$sql = 'SELECT * FROM WORDERDB.V_JD_CASHRECEIPT WHERE order_id=:order_id';
$row = Yii::app()->oci->createCommand($sql)->queryRow(true, [':order_id'=>$order_id]);
echo "<pre>";
print_r($row);
结果:
这样就连接oracle数据库了。