如何使用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/client64export ORACLE_BASE=/usr/lib/oracle/21export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATHexport 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 successfullyInstalling '/usr/lib64/php/modules/oci8.so'install ok: channel://pecl.php.net/oci8-2.2.0configuration option "php_ini" is not set to php.ini locationYou 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 httpdsystemctl 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_ociextension=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) : "&nbsp;") . "</td>\\n";        print "</tr>\\n";print "</table>\\n";oci_free_statement($stid);
​​​​​​​访问数据库成功

以上是关于如何使用PHP链接Oracle数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何使用PHP链接Oracle数据库

如何从 PHP 连接 Oracle 数据库

PHP v5.2.6 链接远程Oracle数据库

laravel5.8(十四)连接oracle数据库

如何用php实现两个Oracle数据库同步功能?

php如何读取clob字段