荆轲刺秦王
如果我们有需要在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扩展就完成啦
525

被折叠的 条评论
为什么被折叠?



