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;
});
调用次数与时间
协程比普通调用快,调用次数越多,时间差越明显,异步模式使得性能得到很大提升。