官网文档已经说明了协程mysql客户端的使用方法
有几种情况
只有一个协程客户端,同步代码 异步执行
官网实例已经说明,如下 https://wiki.swoole.com/wiki/page/p-coroutine_realization.html
多个协程客户端 同步代码 异步执行
其实就像默认的,他会按如上的顺序逐个执行
多个协程客户端 并发执行
并发执行主要涉及到两个方法setDefer延迟发送和recv收包
setDefer对下一行的io起作用,也就是不在那里进行收包,而是手动收包,从而达到并行效果
测试代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| $http->on('request', function ($request, $response) use ($http, &$n) {
if ($request->server['request_uri'] == '/favicon.ico') { $response->status(404); $response->end('404'); }
$config = [ 'host' => '127.0.0.1', 'port' => 3306, 'user' => 'root', 'password' => 'root', 'database' => 'test', ];
$swoole_mysql1 = new \Swoole\Coroutine\MySQL(); $swoole_mysql1->connect($config); $stmt1 = $swoole_mysql1->prepare('select sleep(3) , uname from test where id = ?'); $swoole_mysql1->setDefer(); $ret1 = $stmt1->execute(array(1)); var_dump('ret1:' . time());
$swoole_mysql2 = new \Swoole\Coroutine\MySQL(); $swoole_mysql2->connect($config); $stmt2 = $swoole_mysql2->prepare('select sleep(1),uname from test where id = ?'); $swoole_mysql2->setDefer(); $ret2 = $stmt2->execute(array(2)); var_dump('ret2:' . time());
$res1 = $swoole_mysql1->recv(); var_dump($res1); $res2 = $swoole_mysql2->recv(); var_dump($res2);
$response->end(time()); });
|
可以发现时间差只有3s,协程确实有效,swoole诚不欺我
注意要点
如上所示:setDefer应该用在具体查询的部分而不是连接的部分,否则会出现意外的错误