swoole mysql 协程_swoole-orm: 基于swoole的mysql协程连接池,简单封装。实现多个协程间共用同一个协程客户端。参考thinkphp-orm...

swoole-orm是一个基于swoole的MySQL协程连接池,提供简单的封装,实现多个协程间共享同一个协程客户端。包括版本迭代,如修复查询bug,增加日志功能,支持事务处理等。使用Composer安装,提供查询、添加、更新、删除等基本数据库操作。
摘要由CSDN通过智能技术生成

swoole-orm

基于swoole的mysql协程连接池,简单封装。

实现多个协程间共用同一个协程客户端

感谢完善

[1]:nowbe -> 新增数据返回insert_id

版本

v0.0.1

1、初完成

v0.0.2

1、修复find()查询bug

v0.0.3

1、将splqueque修改为channel

2、添加lock()

3、添加日志

4、表前缀

v0.0.4

1、添加setDefer -> 设置是否返回结果(默认为true。部分操作,例如insert,update等,如果不需要返回返回结果,则可以设置为false)

2、使用go处理协程

3、完善日志功能

v0.0.5

1、去掉日志功能,修改为在log文件打印错误信息和抛出异常

2、添加断线重连功能

3、添加instance()函数,如果有特殊需求扩展无法实现,又想共用连接池时,譬如事务处理,此时可以通过instance获取一个连接

4、添加put()函数,配合instance使用,使用完连接后,将连接put回连接池里

5、find()函数bug修复,返回一维数组

v0.0.6

1、修复返回类型报警提示

2、修复where bug

v0.0.7

1、where的or修复

引入

>composer require sethink/swoole-orm

入门例子

namespace Demo;

include_once "./vendor/autoload.php";

use sethink\swooleOrm\Db;

use sethink\swooleOrm\MysqlPool;

use swoole;

class Demo

{

protected $server;

protected $MysqlPool;

public function __construct()

{

$this->server = new Swoole\Http\Server("0.0.0.0", 9501);

$this->server->set(array(

'worker_num' => 4,

'max_request' => 50000,

'reload_async' => true,

'max_wait_time' => 30,

));

$this->server->on('Start', function ($server) {});

$this->server->on('ManagerStart', function ($server) {});

$this->server->on('WorkerStart', array($this, 'onWorkerStart'));

$this->server->on('WorkerStop', function ($server, $worker_id) {});

$this->server->on('open', function ($server, $request) {});

$this->server->on('Request', array($this, 'onRequest'));

$this->server->start();

}

public function onWorkerStart($server, $worker_id)

{

$config = [

'host' => '127.0.0.1', //服务器地址

'port' => 3306, //端口

'user' => 'root', //用户名

'password' => 'root', //密码

'charset' => 'utf8', //编码

'database' => 'test', //数据库名

'prefix' => 'sethink_', //表前缀

'poolMin' => 5, //空闲时,保存的最大链接,默认为5

'poolMax' => 1000, //地址池最大连接数,默认1000

'clearTime' => 60000, //清除空闲链接定时器,默认60秒,单位ms

'clearAll' => 300000, //空闲多久清空所有连接,默认5分钟,单位ms

'setDefer' => true, //设置是否返回结果,默认为true,

];

$this->MysqlPool = new MysqlPool($config);

unset($config);

//执行定时器

$this->MysqlPool->clearTimer($server);

}

public function onRequest($request, $response)

{

$rs = Db::init($this->MysqlPool)

->name('tt')

->select();

var_dump($rs);

}

}

new Demo();

基本使用

查询

查询单条

Db::init($this->MysqlPool)

->name('user_info')

->field('id,username,info')

->where(['username'=>'sethink','password'=>'sethink'])

->find();

查询多条

Db::init($this->MysqlPool)

->name('info')

->field('id,username,password,info')

->select();

添加

添加单条数据

$data = [

'username' => 'sethink2',

'password' => 'sethink2',

'info' => 'ceshi2'

];

Db::init($this->MysqlPool)

->name('user_info')

->insert($data);

批量添加

$data = [

[

'username' => 'sethink3',

'password' => 'sethink3',

'info' => 'ceshi3'

],

[

'username' => 'sethink4',

'password' => 'password4',

'info' => 'ceshi4'

]

];

Db::init($this->MysqlPool)

->name('user_info')

->insertAll($data);

更新数据

Db::init($this->MysqlPool)

->name('user_info')

->where(['username'=>'sethink4'])

->update(['password'=>'sethink4-4']);

删除数据

Db::init($this->MysqlPool)

->name('user_info')

->where(['username'=>'sethink4'])

->delete();

详解

init($server)

$server为swoole服务器

instance()

如果有特殊需求扩展无法实现,又想共用连接池时,譬如事务处理,此时可以通过instance获取一个连接

例子:

$mysql = Db::init($this->MysqlPool)->instance();

put($mysql)

配合instance使用,使用完连接后,将连接put回连接池里

例子:

$mysql = Db::init($this->MysqlPool)->instance();

$mysql->query('select * from `user_info`');

Db::init($this->MysqlPool)->put($mysql);

name($tableName)

$tableName为表名 -- 字符串

field($field)

$field为查询的字段名 -- 字符串

order($order)

order by排序 -- 数组(一维数组或者二维数组)

例子:

$order为一维数组时

Db::init($this->MysqlPool)

->name('user_info')

->field('id,username')

->order(['id'=>'desc'])

->select();

$order为二维数组时

Db::init($this->MysqlPool)

->name('user_info')

->field('id,username')

->order([['id'=>'desc'],['info'=>'asc']])

->select();

group($group)

group by分组 -- 字符串

例子:

Db::init($this->MysqlPool)

->name('user_info')

->field('id,username')

->group('info')

->select();

### having($having)

用于配置group从分组中筛选数据 -- 字符串

例子:

Db::init($this->MysqlPool)

->name('user_info')

->field('id,username')

->group('info')

->having('count(info) > 5')

->select();

distinct($distinct)

数据去重

$distinct为bool值

例子:

Db::init($this->MysqlPool)

->name('user_info')

->field('id,username')

->distinct(true)

->select();

lock($state)

加锁

例子:

//1、传入bool值

Db::init($this->MysqlPool)

->name('user_info')

->where(['id'=>1])

->lock(true)

->find();

//会自动在sql语句加上FOR UPDATE

//2、传入字符串

Db::init($this->MysqlPool)

->name('user_info')

->where(['id'=>1])

->lock('lock in share mode')

->find();

//特殊锁要求

fetchSql()

获取sql语句

例子:

Db::init($this->MysqlPool)

->name('user_info')

->field('id,username')

->fetchSql()

->select();

where($whereArray)

$whereArray为数组

例子1:

//1、

$where = [

'id'=>'1'

];

//2、

$where = [

'id'=>['>',5]

];

//3、

$where = [

'username'=>['LIKE','%seth%']

];

//4、

$where = [

'id'=>['in',['1','5']]

];

//5、

$where = [

'note_info'=>['=','sethink','or']

];

Db::init($this->MysqlPool)

->name('user_info')

->field('id,username')

->where($where)

->select();

Db::init($this->MysqlPool)

->name('user_info')

->field('id,username')

->where(['id'=>['>',5]])

->where(['id'=>['<=',10]])

->select();

find()

查询一条数据,返回一维数组

select()

查询一条或多条数据,返回二维数组

insert($data)

插入单条数据

$data为一维数组

insertAll($data)

插入多条数据

$data为二维数组

update($data)

更新数据

$data为一维数组

delete()

删除数据

query($sql)

执行sql语句 -- 字符串

例子:

$sql = 'select * from `user_info`';

Db::init($this->MysqlPool)->query($sql);

setDefer($bool)

部分操作,例如insert,update等,如果不需要返回结果,则可以设置为false。

相对于$bool为true,sql执行后,由于主进程和协程间不需要再通信,可以立即往下执行程序

也可以全局设置,添加配置

$config = [

'setDefer' => true //设置是否返回结果,默认为true

];

$this->MysqlPool = new MysqlPool($config);

//此操作不会返回结果

Db::init($this->MysqlPool)

->name('user_info')

->setDefer(false)

->insert(['username'=>'sethink_5']);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值