namespace libraryPool;
use libraryUsualToolMysql;
/**
* 基于Swoole的数据库连接池
* 目前支持Mysql
* $mode 默认0,0CLI模式 1客户端模式
* $worker_num 默认5,进程数
* $task_num 默认10,维持连接数
* $dispatch_mode 默认2,1轮循 2固定 3抢占 4IP分配 5UID分配 7stream
* $daemonize 默认0,守护进程 1开启 0关闭
*/
class UTPool{
protected $log_file;
protected $max_request;
public function __construct($host='127.0.0.1',$port='9510',$mode='0',$worker_num='5',$task_num='10',$dispatch_mode='2',$daemonize='0'){
$this->host = $host;
$this->port = $port;
$this->mode = $mode;
$this->worker_num = $worker_num;
$this->task_worker_num = $task_num;
$this->dispatch_mode = $dispatch_mode;
$this->daemonize = $daemonize;
$this->max_request = 10000;
if($this->mode==0):
$this->pool = new SwooleServer($this->host, $this->port);
$this->pool->set(array(
'worker_num'=>$this->worker_num,
'task_worker_num' => $this->task_worker_num,
'max_request' => $this->max_request,
'daemonize' => $this->daemonize,
//'log_file' => "/www/wwwroot/test/log.txt",//日志地址
'dispatch_mode' => $this->dispatch_mode
));
endif;
}
public function Run(){
$this->pool->on('Receive', array($this, 'OnReceive'));
$this->pool->on('Task', array($this, 'OnTask'));
$this->pool->on('Finish', array($this, 'OnFinish'));
$this->pool->start();
}
public function OnReceive($serv, $fd, $from_id, $data){
$result = $this->pool->taskwait($data);
if ($result !== false) {
$result=json_decode($result,true);
if ($result['status'] == 'OK') {
$this->pool->send($fd, json_encode($result['data']) . "
");
} else {
$this->pool->send($fd, $result);
}
return;
} else {
$this->pool->send($fd, "Error. Task timeout
");
}
}
public function OnTask($serv, $task_id, $from_id, $sql){
static $link = null;
UTKILL:
if ($link == null) {
$link = UsualToolMysqlUTMysql::GetMysql();
if (!$link) {
$link = null;
$this->pool->finish(mysqli_error($link));
return;
}
}
$result = $link->query($sql);
if (!$result) {
if(in_array(mysqli_errno($link),[2013,2006])){
$link = null;
goto UTKILL;
}else{
$this->pool->finish(mysqli_error($link));
return;
}
}
if(preg_match("/^select/i", $sql)){
$data = array();
while ($fetchResult = mysqli_fetch_assoc($result) ){
$data['data'][]=$fetchResult;
}
}else{
$data['data'] = $result;
}
$data['status']="OK";
$this->pool->finish(json_encode($data));
}
public function OnFinish($serv, $task_id, $data){
echo "done";
}
public function Query($sql){
$timeout=20;//请求超时时间
$client=new SwooleClient(SWOOLE_SOCK_TCP);
$client->connect($this->host,$this->port,$timeout) or die("connection failed");
$client->send($sql);
$data = $client->recv();
$client->close();
return json_decode($data,true);
}
}服务端 server.php
//服务器启动端 php server.php
require_once dirname(__FILE__).'/'.'autoload.php';
//默认配置简单写法
$pool=new libraryPoolUTPool("127.0.0.1",9639,0);
/**
* 配置详细写法
* 第1个参数:主机
* 第2个参数:端口
* 第3个参数:默认0,0CLI模式 1客户端模式
* 第4个参数:默认5,进程数
* 第5个参数:默认10,维持连接数
* 第6个参数:默认2,1轮循 2固定 3抢占 4IP分配 5UID分配 7stream
* 第7个参数:默认0,守护进程 1开启 0关闭
*/
//$pool=new libraryUsualToolPoolUTPool("127.0.0.1",9637,0,5,10,2,0);
$pool->Run();客户端 index.php
//客户端
require_once dirname(__FILE__).'/'.'autoload.php';
$pool=new libraryPoolUTPool("127.0.0.1",9639,1);
$data=$pool->Query("select * from log limit 1");
print_r($data);