Swoole协程并发调用实践—解决串行IO阻塞问题

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;
});

调用次数与时间

协程比普通调用快,调用次数越多,时间差越明显,异步模式使得性能得到很大提升。
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 2

可以试试通过coroutine+channel

1年前 评论
meigo (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!