记一次 ThinkPHP5 配置 MySQL+Oracle 多数据库连接遇到的坑
一、使用的软件版本及需求说明
软件版本
- Apache 2.4.39
- PHP 5.6.9
- MySQL 5.7
- Oracle 11g
- ThinkPHP 5.0
需求说明
当前项目中为PHP+MySQL结构,在后续的开发中需要加入对Oracle数据库的操作,所以需要项目可以同时连接操作MySQL和Oracle数据库,MySQL为原有默认操作,在需要操作Oracle库时临时切换数据库连接。
二、PHP配置Oracle支持扩展
1、准备需要的文件
下载Oracle客户端支持库
https://www.oracle.com/database/technologies/instant-client/downloads.html
下载PHPOracle支持扩展文件
http://pecl.php.net/package/oci8
2、将对应文件放在对应位置
将客户端文件中的oci.dll
文件放入C:\Windows\System32
目录中,将PHP扩展文件php_oci8.dll
放入PHP安装目录的\ext
目录下
3、在PHP中配置扩展
打开php.ini
文件,在其中加入如下内容,然后重启Apache服务
extension=php_oci8.dll
extension=php_pdo_oci.dll # 此文件为PHP安装包内自带
注:如果以上配置存在,则将前面的“;”注释符号去掉即可
4、检查扩展加载是否成功
使用phpinfo()
查看扩展加载情况,检查OCI8
和PDO_OCI
吃否成功显示
三、遇到的一些坑及解决过程
1、ThinkPHP5.0如何配置第二个Oracle数据库?
可在config.php中添加如下配置
// Oracle数据库配置
'oracle' => [
'type' => '\think\oracle\Connection', // 数据库类型
'hostname' => '127.0.0.1', // 服务器地址
'database' => 'dbname', // 数据库名
'username' => 'username', // 用户名
'password' => 'password', // 密码
'hostport' => '1521', // 端口
// 其他的数据库连接参数...
'charset' => 'zhs16gbk', // 字符集
],
默认情况仍使用MySQL数据库,需要调用Oracle数据库是使用如下语句
Db::connect(config('oracle'))->query('SQL语句', [], false, true);
2、提示找不到Oracle方法类
Class '\think\oracle\Connection' not found
原因是ThinkPHP5.0中默认不包含Oracle支持类,需要下载后手动加入扩展
下载地址:https://github.com/HelloWuJiaYi/SiteEncrypt
其中有3.0、2.0和master三个版本,需要根据ThinkPHP的版本下载对应的版本,ThinkPHP5.0下载的是master这个。下载后将文件夹名改为oracle,并放置在.\thinkphp\library\think
目录下后,即可成功调用Oracle方法类。
3、各种提示OCI扩展加载失败的可能原因和解决办法
- Oracle客户端、OCI扩展支持与PHP版本不匹配,下载到错误的文件版本
- 缺少相关文件,可将下载的Oracle客户端支持库文件夹下的dll文件都拷贝到
system32目录下
,一般就可以解决