一.下载安装
集成环境 phpstudy2016 要连接的oracle为12c
【查看版本号:phpinfo() => 搜索‘architecture’ 结构,内核,代表了php的版本号】
打开扩展
extension=php_oci8_12c.dll
extension=php_pdo_oci.dll
查看这个时候打开phpinfo();如果这时候你还看不到你的扩展成功开启 ,
是因为你没安装oracle 客户端(有人会有疑虑我连其他人的oracle为什么我本地还要装客服端,PHP连接扩展中需要依赖oracle客服端中的文件)
下载对应版本的oracle instant client
http://www.oracle.com/technetwork/cn/database/features/instant-client/index-092699-zhs.html
选择自己要下载的版本
X86 对应32 位版本
划重点了:需要下载这两个压缩包 ,安装到统一路径下,请看好是“basicLIte”和sqlplus版本 ,并且版本号统一
1、 将instantclient-basic和instantclient-sqlplus两个安装包放在同一个目录下,解压。
在这里,我们放在E:\Oracle下,解压到当前文件夹,最后会自动生成一个新的文件夹instantclient_11_2,两个安装包的文件都会放到该文件夹下,即 E:\Oracle\instantclient_11_2。
2、 修改系统变量
1> 将E:\Oracle\instantclient_11_2添加到系统变量PATH中
TNS_ADMIN=E:\Oracle\instantclient_11_2 -->> 指定tnsnames.ora所在位置
需重启电脑让修改的系统变量生效 需重启电脑让修改的系统变量生效 需重启电脑让修改的系统变量生效。
测试有没有安装成功方法
cmd
sqlplus scott/tiger@orcl
SQLPlus: Release 11.2.0.1.0 Production on Fri Aug 8 10:17:53 2014
Copyright © 1982, 2010, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL>
出现即测试成功
至此,Oracle Instant Client和SQlPlus安装完成。
二.下载oci扩展包
http://pecl.php.net/package/oci8 根据需要选择
另外附下载扩展地址:https://windows.php.net/downloads/pecl/releases/oci8/
下载后解压,将相关.dll文件复制到php环境扩展文件夹中 /php/ext/
三.安装好验证之后,修改PHP配置文件php.ini 文件,增加扩展
extension=php_oci8.dll
extension=php_oci8_12c.dll(具体扩展版本号根据自己第三步中安装的oci版本匹配)
四,进行完之后可重复进行第一部验证,发现phpinfo中多了oci模块,否则请重新仔细检查前几步是否完全正确
参考地址 https://blog.csdn.net/denghaolinzy/article/details/96481803
成功安装连接时出现的问题汇总
PDOException in Connection.php line 295
SQLSTATE[HY000]: pdo_oci_handle_factory: ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
composer引入的oracle包里
vendor\topthink\think-oracle\src\Connection.php
parseDsn 方法修改为
protected function parseDsn($config)
{
$dsn = 'oci:dbname=';
if (!empty($config['hostname'])) {
// Oracle Instant Client
$dsn.='(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = '.$config['hostname'].')(PORT = '.$config['hostport'].'))
(CONNECT_DATA =
(SID = '.$config['database'].')
)
)';
}
if (!empty($config['charset'])) {
$dsn .= ';charset=' . $config['charset'];
}
return $dsn;
}
参考文章地址 https://blog.csdn.net/wq57885/article/details/82929439
本人初次实现利用tp中的扩展连接 出现连接缓慢需等待1分钟 有时还崩溃 报错超时 后经大牛指点利用workerman来做一个连接池进行连接 然后再接口中请求workerman中的tcp端口 加以适当的缓存进行解压 利用的workerman中的定时器每10分钟保持一次oracle连接 下面上代码了 过程不易 希望解决了问题的朋友标明原地址 workerman的安装本人不多说了 直接composer下载就可以
use Workerman\Worker;
use Workerman\Lib\Timer;
require_once __DIR__ . '/../vendor/autoload.php';
// 创建一个Worker监听2345端口,使用http协议通讯
$http_worker = new Worker("http://0.0.0.0:2345");
global $conn;
$conn = oci_connect('账号', '密码 ', '(DEscriptION=(ADDRESS=(PROTOCOL =TCP)(HOST=地址 )(PORT = 端口))(CONNECT_DATA =(SID=orcl)))','UTF8');
// 启动4个进程对外提供服务
$http_worker->count = 3;
//加入定时器 进行每10分钟进行重连 实现24h连接
$http_worker->onWorkerStart = function($task){
Timer::add(600, function() {
global $conn;
oci_close($conn);
$conn = oci_connect('账号', '密码 ', '(DEscriptION=(ADDRESS=(PROTOCOL =TCP)(HOST=地址 )(PORT = 端口))(CONNECT_DATA =(SID=orcl)))','UTF8');
});
};
// 接收到浏览器发送的数据时回复hello world给浏览器
$http_worker->onMessage = function($connection, $data)
{
$datatype = $data['get']; //data中可以接收到浏览器发送的post get等请求参数
$page = isset($datatype['page'])? $datatype['page']:1;
$limit = isset($datatype['limit']) ? $datatype['limit'] : 10;
global $conn;
$select = '放sql语句此处';
$result_rows = oci_parse($conn, $select);
if($result_rows){
$row_count = oci_execute($result_rows);
if($row_count){
$i=0;
while($row = oci_fetch_array($result_rows, OCI_ASSOC)) {
foreach($row as $key=>$item) {
$info[$i][$key] = $item;
}
$i++;
}
}
}
$traInfo = isset($info)?json_encode($info):'';
$connection->send($traInfo);
};
// 运行worker
Worker::runAll();
?>
完成后 cmd中 php运行此文件即可启动服务 请注意此文件中不能用exit die 不能出现任何报错情况 否则会导致服务停止
整理不易 谢谢观看 转载请注明原创地址