php接入远程oracl 利用workerman建立持久连接不断线

一.下载安装
集成环境 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 位版本
php接入远程oracl 利用workerman建立持久连接不断线_第1张图片
划重点了:需要下载这两个压缩包 ,安装到统一路径下,请看好是“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和SQl
Plus安装完成。

二.下载oci扩展包
http://pecl.php.net/package/oci8 根据需要选择

另外附下载扩展地址:https://windows.php.net/downloads/pecl/releases/oci8/

php接入远程oracl 利用workerman建立持久连接不断线_第2张图片
下载后解压,将相关.dll文件复制到php环境扩展文件夹中 /php/ext/
三.安装好验证之后,修改PHP配置文件php.ini 文件,增加扩展
extension=php_oci8.dll
extension=php_oci8_12c.dll(具体扩展版本号根据自己第三步中安装的oci版本匹配)

四,进行完之后可重复进行第一部验证,发现phpinfo中多了oci模块,否则请重新仔细检查前几步是否完全正确

php接入远程oracl 利用workerman建立持久连接不断线_第3张图片

参考地址 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 不能出现任何报错情况 否则会导致服务停止

整理不易 谢谢观看 转载请注明原创地址

你可能感兴趣的:(php,oracle)