PHP 使用 EventHttpRequest 实现并发请求

244 阅读1分钟

通常我们在使用 PHP 实现并发请求时,都会选择 curl_multi_init 来实现。但在 PHP7 中,我们还可以使用 Event 扩展中的 EventHttpRequest 来实现并发请求


<?php
    $addresses = [
        'www.baidu.com',
        'www.sohu.com',
        'www.tmall.com',
        'www.jd.com',
    ];
    $port = 80;
    // 记录所有创建的 EventHttpConnection 对象
    $connections = [];
    // 记录每个 EventHttpConnection 对象所对应的 EventHttpRequest 对象
    $requests = [];

    function request_handle($request, $base)
    {
        if (is_null($request)) {
            echo 'Time out' . PHP_EOL;
        } else {
            $response_code = $request->getResponseCode();

            if ($response_code == 0) {
                echo 'Connection refused' . PHP_EOL;
            } elseif ($response_code != 200) {
                echo 'Unexpected response:' . $response_code . PHP_EOL;
            } else {
                echo 'Success:' . $response_code . PHP_EOL;
                $buf = $request->getInputBuffer();
                echo 'Body:' . PHP_EOL;
                while ($s = $buf->readLine(EventBuffer::EOL_ANY)) {
                    echo $s, PHP_EOL;
                }
            }
        }

        $request->free();
    }

    $base = new EventBase();
    $dns = new EventDnsBase($base, true);

    foreach ($addresses as $key => $address) {
        $connections[$key] = new EventHttpConnection($base, $dns, $address, $port);
        $requests[$key] = new EventHttpRequest('request_handle', $base);
        $connections[$key]->makeRequest($requests[$key], EventHttpRequest::CMD_GET, '/');
    }

    $base->loop();