并发调用

最后更新于:2022-04-02 06:29:40

# 并发调用 [TOC] ## 并发请求 在协程版本的`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 使用实例 ~~~ function onRequest($request, $response) { //并发请求 n $n = 5; for ($i = 0; $i < $n; $i++) { $cli = new Swoole\Coroutine\Http\Client('127.0.0.1', 80); $cli->setHeaders([ 'Host' => "local.ad.oa.com", "User-Agent" => 'Chrome/49.0.2587.3', 'Accept' => 'text/html,application/xhtml+xml,application/xml', 'Accept-Encoding' => 'gzip', ]); $cli->set([ 'timeout' => 2]); $cli->setDefer(); $cli->get('/test.php'); $clients[] = $cli; } for ($i = 0; $i < $n; $i++) { $r = $clients [$i]->recv(); $result[] = $clients[$i]->body; } $response->end(json_encode($data)); } ~~~
';