sethink / swoole-orm
This package is abandoned and no longer maintained.
No replacement package was suggested.
sethink
v0.0.7
2019-09-24 04:47 UTC
Requires
- php: >=7.0.0
- ext-swoole: >=4.2.7
README
基于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
入门例子
<?php 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();
基本使用
查询
查询单条
<?php Db::init($this->MysqlPool) ->name('user_info') ->field('id,username,info') ->where(['username'=>'sethink','password'=>'sethink']) ->find();
查询多条
<?php Db::init($this->MysqlPool) ->name('info') ->field('id,username,password,info') ->select();
添加
添加单条数据
<?php $data = [ 'username' => 'sethink2', 'password' => 'sethink2', 'info' => 'ceshi2' ]; Db::init($this->MysqlPool) ->name('user_info') ->insert($data);
批量添加
<?php $data = [ [ 'username' => 'sethink3', 'password' => 'sethink3', 'info' => 'ceshi3' ], [ 'username' => 'sethink4', 'password' => 'password4', 'info' => 'ceshi4' ] ]; Db::init($this->MysqlPool) ->name('user_info') ->insertAll($data);
更新数据
<?php Db::init($this->MysqlPool) ->name('user_info') ->where(['username'=>'sethink4']) ->update(['password'=>'sethink4-4']);
删除数据
<?php Db::init($this->MysqlPool) ->name('user_info') ->where(['username'=>'sethink4']) ->delete();
详解
init($server)
$server为swoole服务器
instance()
如果有特殊需求扩展无法实现,又想共用连接池时,譬如事务处理,此时可以通过instance获取一个连接
例子:
<?php $mysql = Db::init($this->MysqlPool)->instance();
put($mysql)
配合instance使用,使用完连接后,将连接put回连接池里
例子:
<?php $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为一维数组时
<?php Db::init($this->MysqlPool) ->name('user_info') ->field('id,username') ->order(['id'=>'desc']) ->select();
$order为二维数组时
<?php Db::init($this->MysqlPool) ->name('user_info') ->field('id,username') ->order([['id'=>'desc'],['info'=>'asc']]) ->select();
group($group)
group by分组 -- 字符串
例子:
<?php Db::init($this->MysqlPool) ->name('user_info') ->field('id,username') ->group('info') ->select();
### having($having)
用于配置group从分组中筛选数据 -- 字符串
例子:
<?php Db::init($this->MysqlPool) ->name('user_info') ->field('id,username') ->group('info') ->having('count(info) > 5') ->select();
distinct($distinct)
数据去重
$distinct为bool值
例子:
<?php Db::init($this->MysqlPool) ->name('user_info') ->field('id,username') ->distinct(true) ->select();
lock($state)
加锁
例子:
<?php //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语句
例子:
<?php Db::init($this->MysqlPool) ->name('user_info') ->field('id,username') ->fetchSql() ->select();
where($whereArray)
$whereArray为数组
例子1:
<?php //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();
<?php 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语句 -- 字符串
例子:
<?php $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);
<?php //此操作不会返回结果 Db::init($this->MysqlPool) ->name('user_info') ->setDefer(false) ->insert(['username'=>'sethink_5']);