如何使用PHP链接Oracle数据库
Posted 李斌的BLOG
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用PHP链接Oracle数据库相关的知识,希望对你有一定的参考价值。
Oracle数据库是免费薅来的,俗话说不用白不用,既然有这个资源就想怎么利用起来,然后就开始整,因为网络上的文章都是老的,已经不适用于新版本的数据库和php版本了,结果遇到了很多坑,经过不懈努力终于成功上岸,特此分享。
1、Linux版
-
服务器:CentOS7
-
PHP版本:V7.4.3
-
Oracle数据库版本:19c
(1) 安装oracle客户端
首先去Oracle官网下载三个包到电脑本地,下载链接:
https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html
-
oracle-instantclient-devel-21.1.0.0.0-1.x86_64.rpm
-
oracle-instantclient-basic-21.1.0.0.0-1.x86_64.rpm
-
oracle-instantclient-sqlplus-21.1.0.0.0-1.x86_64.rpm
将这三个包上传到/usr/lib/oracle目录下(oracle文件夹为新建文件夹),进入文件夹执行安装命令:
$ rpm -ivh oracle-instantclient-*
添加环境变量,并保存:
$ vim /etc/profile
# 在尾部增加如下内容
export ORACLE_HOME=/usr/lib/oracle/21/client64
export ORACLE_BASE=/usr/lib/oracle/21
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export PATH=$ORACLE_HOME/bin:$PATH
保存退出后执行以下命令后使环境变量生效:
$ source /etc/profile
注意:安装oci8和pdo_oci扩展都需要进行这第一步
(2)安装oci8扩展
因编译安装经常报各种错误,这里推荐使用pecl安装:
$ export PHP_DTRACE=yes
$ pecl install oci8-2.2.0
# 输入路径
instantclient,/usr/lib/oracle/21/client64/lib
若报错 Cannot find sys/sdt.h which is required for DTrace support
执行安装:yum install systemtap-sdt-devel
看到以下信息表示安装扩展成功:
Build process completed successfully
Installing '/usr/lib64/php/modules/oci8.so'
install ok: channel://pecl.php.net/oci8-2.2.0
configuration option "php_ini" is not set to php.ini location
You should add "extension=oci8.so" to php.ini
在php.ini中增加扩展引入extension=oci8.so :
$ vi /etc/php.ini
# 添加
extension=oci8.so
# 验证是否成功
$ php -m | grep oci8
# 出现oci8表示安装成功
oci8
# 需要修改下/usr/lib64/php/modules/oci8.so 文件权限755
(3)安装pdo_oci扩展
vi /etc/ld.so.conf
# 加入此行,保存退出
/usr/lib/oracle/21/client64/lib/
建立软连接,如果安装oci8扩展时,已经建立过,跳过即可
ln -s /usr/lib/oracle/21/client64 /usr/lib/oracle/21/client
ln -s /usr/include/oracle/21/client64 /usr/include/oracle/21/client
去PHP官方下载php-7.4.19.tar.gz压缩文件,解压后将pdo_oci文件夹放到服务器的php扩展目录中:cd /usr/include/php/ext,然后执行下面的命令:
# 执行下方命令,编译安装处理,类似oci8安装
$ cd /usr/include/php/ext/pdo_oci
$ /usr/bin/phpize
$ ./configure --with-pdo-oci=instantclient,/usr/lib/oracle/21/client64/lib \\
--with-oci8=instantclient,/usr/lib/oracle/21/client64/lib
$ make && make install
添加pdo_oci扩展:
$ vi /etc/php.d/pdo_oci.ini # pdo_oci.ini是新建的
$ extension=/usr/lib64/php/modules/pdo_oci.so # 此处为pdo_oci.so的全路径,在编译后有展示
重启PHP服务:
systemctl restart httpd
systemctl restart php-fpm
(4)测试PHP连接Oracle数据库
首先准备连接文件,在oracle数据库下载 oralce wallet 文件,这个在Oracle数据库后台管理里面下载,解压出来一般有以下文件:
将文件夹放到服务器的一个目录里(🔔注意保密哦),这里我放在/usr/lib/oracle/Wallet_videoplatform2,然后PHP测试代码如下:
<?php
// tnsnames.ora 信息里拼接数据库连接信息(照着拼就行了)
$dbstr ="tcps://adb.ap-seoul-1.oraclecloud.com:1522/ge815e794bb3bb9_xxxxxxxxx_high.adb.oraclecloud.com?wallet_location=/usr/lib/oracle/Wallet_videoplatform2";
$dbconn = oci_connect('用户名','密码',$dbstr);
if($dbconn!=false)
echo "连接成功".'<br/>';
if(OCILogOff($dbconn)==true)
echo "关闭连接成功!".'<br/>';//
else
echo "连接失败".'<br/>';
echo phpinfo();
若出现 ORA-12546: TNS:permission denied 错误执行以下语句即可:
setsebool -P httpd_can_network_connect on
访问页面,结果:
终于连接成功了!
2、Windows版
(1) 安装OCI8
PHP7 需要选择 2.2.0 版本的oci,根据自己的PHP版本自行选择版本:
下载链接:https://pecl.php.net/package/oci8/2.2.0/windows
可以先通过查看phpinfo() 的PHP Extension Build 栏位查看,我的PHP是NTS版的,所以下载oci也要是NTS版的。
下载完后,将解压的文件,拷贝到PHP扩展目录php7.4.3nts\\ext下覆盖原文件,扩展目录在php.ini中 extension_dir = xxxxxx指定。
(2)安装Oracle Client客户端
Oracle Instant Client 是一组可轻松安装的免费库,允许程序连接到本地或远程 Oracle 数据库实例。
-
首先下载oracle客户端 Oracle 官方客户端下载 我这里下的是 instantclient-basic-windows.x64-19.11.0.0.0dbru.zip 版本。
-
将软件包解压缩到单个目录中,例如 D:\\oracle\\instantclient_19_11
-
将此目录添加到PATH环境变量。如果您安装了多个版本的Oracle库,请确保新目录首先出现在路径中。重新启动任何终端窗口,否则请确保您的应用程序使用了新的PATH。
下载完后里面有oci.dll这个文件,当启动了php的扩展后,找的也就是这个 oracle 文件。那php 怎么找这个dll呢,加系统环境变量即可。
然后修改php.ini配置文件:
# 去除前面的分号;开启扩展,若没有就添加
extension=pdo_oci
extension=php_oci8.dll
最后,重启 Apache 即可。
查看是否安装成功,可以用 cmd 命令行查看是否已成功安装oci8扩展,如成功安装则显示以下信息:
也可在phpinfo()中查看扩展信息:
(3)测试PHP连接Oracle数据库
首先准备连接文件,在oracle数据库下载 oralce wallet 文件,解压出来一般有以下文件:
将文件放到本地的一个目录里,这里我放在D:\\oracle\\Wallet_videoplatform2,然后测试代码:
<?php
// tnsnames.ora 信息里拼接数据库连接信息(照着拼就行了)
$dbstr ="tcps://adb.ap-seoul-1.oraclecloud.com:1522/xxxxx_videoplatform2_high.adb.oraclecloud.com?wallet_location=D:\\oracle\\Wallet_videoplatform2";
$conn = oci_connect('ADMIN','xxxxxxx',$dbstr);
if (!$conn)
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
// 查询并渲染
$stid = oci_parse($conn, 'SELECT * FROM users');
$r = oci_execute($stid);
print "<table border='1'>\\n";
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS))
print "<tr>\\n";
foreach ($row as $item)
print " <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : " ") . "</td>\\n";
print "</tr>\\n";
print "</table>\\n";
oci_free_statement($stid);
访问数据库成功
以上是关于如何使用PHP链接Oracle数据库的主要内容,如果未能解决你的问题,请参考以下文章