php执行程序是串行,IO只能在上一个执行完成后才会执行下一个,大部分时间是在等待io,严重影响效率,引入基于swoole协程的概念,实现http并发调用。 | |
php代码实现 | |
$start = microtime(true); | |
$n = 50; | |
for ($i = 0; $i < $n; $i++) { | |
$http = new Http(); | |
$res = $http->get('https://www.taobao.com/'); | |
$res->getBody()->getContents(); | |
} | |
$end = microtime(true); | |
echo bcsub($end,$start,2).PHP_EOL; | |
swoole协程代码实现 | |
go(function (){ | |
$start = microtime(true); | |
//并发请求 n | |
$result = []; | |
$clients = []; | |
$n = 50; | |
for ($i = 0; $i < $n; $i++) { | |
$cli = new \Swoole\Coroutine\Http\Client('www.taobao.com', 443,true); | |
$cli->setHeaders([ | |
'Host' => "www.taobao.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('/'); | |
$clients[] = $cli; | |
} | |
for ($i = 0; $i < $n; $i++) { | |
if (!$clients[$i]->recv()) { | |
continue; | |
} | |
$result[] = $clients[$i]->body; | |
} | |
$end = microtime(true); | |
echo bcsub($end,$start,2).PHP_EOL; | |
}); |
调用次数与时间
协程比普通调用快,调用次数越多,时间差越明显,异步模式使得性能得到很大提升。