在Thinkphp8上安装Oracle扩展

荆轲刺秦王

如果我们有需要在thinkphp8上连接远程oracle服务器的需求 那么我们就可以这样做:
1. 下载Oracle Instant Client

Oracle Instant Client 是 OCI8 扩展的依赖,需要先准备好:

从 Oracle 官网下载与服务器系统匹配的 Instant Client Basic 和 Instant Client SDK

下载地址:https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html

(需注册 Oracle 账号)

这里我这边的Oracle版本是:Oracle Database 11g Release 11.2.0.4.0-64bit Production

所以我下载的是:instantclient-basic-linux.x64-11.2.0.4.0.zip 和 instantclient-sdk-linux.x64-11.2.0.4.0.zip

这里需要因人而异 根据自己需求而下载对应的版本!

下载后操作:

    1.1. 解压两个压缩包,得到一个文件夹(如 instantclient_11_2)

    1.2. 通过宝塔的「文件管理」将该文件夹上传到服务器的 /opt/oracle/ 目录(若没有该目录可手动创建)

    1.3. 确保文件夹权限为 755(右键文件夹设置权限)

2. 通过宝塔安装 OCI8 扩展

注意:安装过程中可能会提示输入 Oracle Instant Client 路径,填写:

/opt/oracle/instantclient_11_2  # 替换为你实际的文件夹路径

如果没有提示,安装后需手动配置:

在php.ini末尾添加以下内容(路径替换为实际路径):

[OCI8]
extension = oci8.so
oci8.oracle_home = /opt/oracle/instantclient_11_2

以上就完成了扩展安装 实际项目中 我们还会在 config/database.php 目录中做设置比如:
 

<?php

return [
    // 默认使用的数据库连接配置
    'default'         => env('DB_DRIVER', 'mysql'),

    // 自定义时间查询规则
    'time_query_rule' => [],

    // 自动写入时间戳字段
    // true为自动识别类型 false关闭
    // 字符串则明确指定时间字段类型 支持 int timestamp datetime date
    'auto_timestamp'  => true,

    // 时间字段取出后的默认时间格式
    'datetime_format' => 'Y-m-d H:i:s',

    // 时间字段配置 配置格式:create_time,update_time
    'datetime_field'  => '',

    // 数据库连接配置信息
    'connections'     => [
        'mysql' => [
            // 数据库类型
            'type'            => env('DB_TYPE', 'mysql'),
            // 服务器地址
            'hostname'        => env('DB_HOST', '127.0.0.1'),
            // 数据库名
            'database'        => env('DB_NAME', 'database'),
            // 用户名
            'username'        => env('DB_USER', 'username'),
            // 密码
            'password'        => env('DB_PASS', 'password'),
            // 端口
            'hostport'        => env('DB_PORT', '3306'),
            // 数据库连接参数
            'params'          => [],
            // 数据库编码
            'charset'         => env('DB_CHARSET', 'utf8mb4'),
            // 数据库表前缀
            'prefix'          => env('DB_PREFIX', ''),

            // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
            'deploy'          => 0,
            // 数据库读写是否分离 主从式有效
            'rw_separate'     => false,
            // 读写分离后 主服务器数量
            'master_num'      => 1,
            // 指定从服务器序号
            'slave_no'        => '',
            // 是否严格检查字段是否存在
            'fields_strict'   => true,
            // 是否需要断线重连
            'break_reconnect' => false,
            // 监听SQL
            'trigger_sql'     => env('APP_DEBUG', true),
            // 开启字段缓存
            'fields_cache'    => false,
        ],

        // 更多的数据库配置信息
        // Oracle额外连接配置
        'oracle' => [
            'type'            => 'oracle',
            'hostname'        => '127.0.0.1',
            'database'        => 'sid',
            'username'        => 'username',
            'password'        => 'password',
            'hostport'        => '1521',
            // 填写完整DSN 结尾加上 charset=UTF8 可以避免中文乱码
            'dsn'             => 'oci:dbname=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))(CONNECT_DATA=(SID=sid)));charset=UTF8',
            'params'          => [
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            ],
            'charset'         => 'AL32UTF8', // Oracle常用字符集
            // 其他配置保持不变
            'prefix'          => '',
            'debug'           => env('app_debug', false),
            // ...
        ],



    ],
];

我们还可以在 app\common\service 目录下增加一个 OracleService 的服务类 就像这样:
 

<?php
namespace app\common\service;

use think\facade\Db;
use think\db\exception\DbException;

class OracleService
{
    /**
     * Oracle连接配置标识
     * @var string
     */
    protected $connection = 'oracle';

    /**
     * 执行Oracle查询并返回结果
     * @param string $sql 要执行的SQL语句
     * @param array $bind 参数绑定数组
     * @return array
     * @throws \RuntimeException
     */
    public function getOracleInfo(string $sql, array $bind = []): array
    {
        try {
            // 使用框架的Db类连接Oracle,通过配置标识调用
            $result = Db::connect($this->connection)
                ->query($sql, $bind);

            return $result ?? [];
        } catch (DbException $e) {
            // 转换为运行时异常,便于上层捕获处理
            throw new \RuntimeException("Oracle查询错误: " . $e->getMessage(), 0, $e);
        }
    }

    /**
     * 动态切换Oracle连接配置
     * @param string $connection 连接配置标识
     * @return $this
     */
    public function setConnection(string $connection): self
    {
        $this->connection = $connection;
        return $this;
    }
}

这样我们可以在控制器中这样调用:

$sql = "select * from pmc_file";
$data = $this->oracleService->getOracleInfo($sql);
print_r($data);exit();

以上在Thinkphp8中安装Oracle扩展就完成啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值