swoole 协程 mysql 客户端等 进一步说明

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

  1. 只有一个协程客户端,同步代码 异步执行
    官网实例已经说明,如下 https://wiki.swoole.com/wiki/page/p-coroutine_realization.html
  2. 多个协程客户端 同步代码 异步执行
    其实就像默认的,他会按如上的顺序逐个执行
  3. 多个协程客户端 并发执行
    并发执行主要涉及到两个方法setDefer延迟发送和recv收包
    setDefer对下一行的io起作用,也就是不在那里进行收包,而是手动收包,从而达到并行效果
    测试代码

    $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应该用在具体查询的部分而不是连接的部分,否则会出现意外的错误

相关文章

此处评论已关闭