Send Http Request Using Eventloop

最近公司发起了一个黑客马拉松大赛,要求发起N个http请求时常不能叠加,如请求两个接口每个接口耗时1秒,则响应应该在1.0x秒附近,而不是2秒或更久

分析了一下需求,理论上使用libevent可以实现,考虑到直接使用PHP的event库可能比较复杂,所以使用了react的http-client可以实现

安装

composer require react/http-client:^0.5.9

测试程序

<?php
header('Content-Type: text/html; charset=utf-8');
require __DIR__ . '/../vendor/autoload.php';
$loop = React\EventLoop\Factory::create();
$client = new React\HttpClient\Client($loop);

for ($i = 0; $i < 3; $i++) {
    $request = $client->request('GET', 'http://local-api.example.com/?q=my' . $i);
    $request->on('response', function ($response) {
        $response->on('data', function ($chunk) {
            echo $chunk . "\n";
        });
        $response->on('end', function () {
            echo '';
        });
    });
    $request->on('error', function (\Exception $e) {
        echo $e;
    });
    $request->end();
}

$s = microtime(true);
$loop->run();
echo microtime(true) - $s;
exit;

输出结果

my0 my2 my1 1.0807709693909

通过结果得知三个接口用时1.08秒