CRMEB(thinkphp6.0)连接oracle数据库 踩坑笔记

一、背景介绍

CRMEB 是一款基于 ThinkPHP 开发的电商系统,默认使用 MySQL 数据库。因对接其他ERP产品需求,需要连接多个数据库,其中一个就是oracle。一开始直接在宝塔后台安装扩展oci8以及pdo_oci扩展,显示安装成功但是phpinfo中无法加载。最终有了这篇开坑笔记。

过程中遇到了诸多环境配置和兼容性问题,特此记录解决方案,供其他开发者参考。

图片[1]-CRMEB(thinkphp6.0)连接oracle数据库 踩坑笔记-牧鸭人博客

二、环境准备

  1. 服务器环境
    • 操作系统:debian 11
    • Web 服务:Nginx 1.26
    • PHP 版本:7.4.33
  2. 所需扩展
    • OCI8:PHP 连接 Oracle 的原生扩展
    • PDO_OCI:PDO 驱动连接 Oracle

三、配置过程

1.安装oracle-instantclient 即时客户端库

首先到oracle官网下载三个文件:
https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html
分别是:basic、devel、sqlplus

2.在服务器建立oracle文件夹,位置如下

图片[2]-CRMEB(thinkphp6.0)连接oracle数据库 踩坑笔记-牧鸭人博客

3.打开终端,进入oracle文件夹中

cd /usr/lib/oracle

4.安装alien和依赖包

sudo apt-get install alien libaio1
sudo alien -i oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm
sudo alien -i oracle-instantclient12.1-devel-12.1.0.2.0-1.x86_64.rpm
sudo alien -i oracle-instantclient12.1-sqlplus-12.1.0.2.0-1.x86_64.rpm

5.以上操作完成后,会生成一个12.1/client64/lib 的文件目录

6.安装php oracle扩展:oci8

下载oci8的对应扩展包,http://pecl.php.net/package/oci8,我们php的版本是7,所以选择下载2.2.0版本

图片[3]-CRMEB(thinkphp6.0)连接oracle数据库 踩坑笔记-牧鸭人博客

解压后,上传到oracle文件夹里

图片[4]-CRMEB(thinkphp6.0)连接oracle数据库 踩坑笔记-牧鸭人博客

在终端中打开该文件夹

cd /usr/lib/oracle/oci8-2.2.0
图片[5]-CRMEB(thinkphp6.0)连接oracle数据库 踩坑笔记-牧鸭人博客

然后继续执行下面的代码

./configure --with-php-config=/www/server/php/74/bin/php-config --with-oci8=shared,instantclient,/usr/lib/oracle/12.1/client64/lib
图片[6]-CRMEB(thinkphp6.0)连接oracle数据库 踩坑笔记-牧鸭人博客
make && make install

一切顺利的话,最后一行会输出一行oci8.so文件的路径

图片[7]-CRMEB(thinkphp6.0)连接oracle数据库 踩坑笔记-牧鸭人博客

7.前往宝塔PHP设置,查看php.ini文件是否引入

图片[8]-CRMEB(thinkphp6.0)连接oracle数据库 踩坑笔记-牧鸭人博客

重载配置,然后重启php,检查phpinfo中是否有oci8配置

图片[9]-CRMEB(thinkphp6.0)连接oracle数据库 踩坑笔记-牧鸭人博客

8.安装pdo_oci,正常通过在线方式安装是安装不上的,这也是我踩坑的关键。

图片[10]-CRMEB(thinkphp6.0)连接oracle数据库 踩坑笔记-牧鸭人博客

一共就2个版本 1.0 1.10

图片[11]-CRMEB(thinkphp6.0)连接oracle数据库 踩坑笔记-牧鸭人博客

1.0 安装条件 5.03<= php <=6.0.0

图片[12]-CRMEB(thinkphp6.0)连接oracle数据库 踩坑笔记-牧鸭人博客

1.1.0 安装条件 8.3<= php

😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂

解决办法,通过php代码仓库找到扩展组件pdo_oci,上传至服务器进行编译安装

图片[13]-CRMEB(thinkphp6.0)连接oracle数据库 踩坑笔记-牧鸭人博客
/www/server/php/74/bin/phpize
./configure --with-php-config=/www/server/php/74/bin/php-config --with-pdo_oci=shared,instantclient,/usr/lib/oracle/12.1/client64/lib

三、thinkphp添加oracle数据量连接

'oracle' => [
            'type'            => 'oracle',
            'hostname'        => '连接地址',
            'database'        => '实例名',
            'username'        => '用户名',
            'password'        => '密码',
            'hostport'        => '端口号',
            'dsn'             => "oci:dbname=//连接地址:端口号/实例名;charset=UTF8",
            'params'          => [
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                PDO::ATTR_TIMEOUT => 30, // 连接超时时间(秒)
            ],
            'charset'         => 'UTF8', // Oracle 常用字符集是 UTF8 或 AL32UTF8
            'prefix'          => '',
            'persistent'      => false, // 禁用持久连接,避免潜在问题
            'options'         => [
                // 其他 PDO 选项
            ],
        ],

四、常见问题及解决方案

1、连接错误:SQLSTATE[HY000]: OCISessionBegin: ORA-21561: OID generation failed

原因:系统主机名配置不正确

解决方案
配置正确的主机名映射:

vi /etc/hosts
# 添加:127.0.0.1   localhost your_hostname

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容