官网文档已经说明了协程mysql客户端的使用方法
有几种情况

  1. 只有一个协程客户端,同步代码 异步执行
    官网实例已经说明,如下 https://wiki.swoole.com/wiki/page/p-coroutine_realization.html

  2. 多个协程客户端 同步代码 异步执行
    其实就像默认的,他会按如上的顺序逐个执行

  3. 多个协程客户端 并发执行
    并发执行主要涉及到两个方法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应该用在具体查询的部分而不是连接的部分,否则会出现意外的错误