• 并发调用
    • 并发请求
    • setDefer 使用实例

    并发调用

    并发请求

    在协程版本的Client中,实现了多个客户端并发发包功能(setDefer机制)。

    通常,如果一个业务请求中需要做一次redis请求和一次mysql请求,那么网络IO会是这样子:

    redis发包->redis收包->mysql发包->mysql收包

    以上流程网络IO的时间就等于 redis网络IO时间 + mysql网络IO时间。

    而对于协程版本的Client,网络IO可以是这样子:

    redis发包->mysql发包->redis收包->mysql收包

    以上流程网络IO的时间就接近于 MAX(redis网络IO时间, mysql网络IO时间)

    现在支持并发请求的Client有:

    • Swoole\Coroutine\Client
    • Swoole\Coroutine\Redis
    • Swoole\Coroutine\MySQL
    • Swoole\Coroutine\Http\Client
      除了Swoole\Coroutine\Client,其他Client都实现了defer特性,用于声明延迟收包。

    因为Swoole\Coroutine\Client的发包和收包方法是分开的,所以就不需要实现defer特性了,而其他Client的发包和收包都是在一个方法中,所以需要一个setDefer()方法声明延迟收包,然后通过recv()方法收包。

    setDefer 使用实例

    1. function onRequest($request, $response)
    2. {
    3. //并发请求 n
    4. $n = 5;
    5. for ($i = 0; $i < $n; $i++) {
    6. $cli = new Swoole\Coroutine\Http\Client('127.0.0.1', 80);
    7. $cli->setHeaders([
    8. 'Host' => "local.ad.oa.com",
    9. "User-Agent" => 'Chrome/49.0.2587.3',
    10. 'Accept' => 'text/html,application/xhtml+xml,application/xml',
    11. 'Accept-Encoding' => 'gzip',
    12. ]);
    13. $cli->set([ 'timeout' => 2]);
    14. $cli->setDefer();
    15. $cli->get('/test.php');
    16. $clients[] = $cli;
    17. }
    18. for ($i = 0; $i < $n; $i++) {
    19. $r = $clients [$i]->recv();
    20. $result[] = $clients[$i]->body;
    21. }
    22. $response->end(json_encode($data));
    23. }