Guzzle异步POST请求未被发送

时间:2017-07-05 07:13:39

标签: php asynchronous guzzle php-7.1 guzzlehttp

我尝试进行4次异步搜索调用(POST HTTP请求)同时搜索4个数据库表,然后等待所有这些调用完成(异步),合并结果并将它们返回给用户。

这是我的代码:

public static function async_search($search_words)
{
    $curl = new CurlMultiHandler();
    $client = new Client([
        'base_uri' => 'https://mytestapi.com/',
        'timeout' => 0,
    ]);

    $finished_promisesArr = array(
        'search1' => 0,
        'search2' => 0,
        'search3' => 0,
        'search4' => 0,
    );

    $bodyArr = array(
        'search_words' => $search_words,
    );

    $search1_promise = $client->requestAsync('POST', 'search1', array(
        'form_params' => $bodyArr,
    ))->then(
        function(ResponseInterface $response) {
            echo 'got response';
            $finished_promisesArr['search1'] = 1;
        },
        function (RequestException $e) {
            $finished_promisesArr['search1'] = 1;
        }
    );

    $search2_promise = $client->requestAsync('POST', 'search2', array(
        'form_params' => $bodyArr,
    ))->then(
        function(ResponseInterface $response) {
            $finished_promisesArr['search2'] = 1;
        },
        function (RequestException $e) {
            $finished_promisesArr['search2'] = 1;
        }
    );

    $search3_promise = $client->requestAsync('POST', 'searchCompanies', array(
        'form_params' => $bodyArr,
    ))->then(
        function(ResponseInterface $response) {
            $finished_promisesArr['search3'] = 1;
        },
        function (RequestException $e) {
            $finished_promisesArr['search3'] = 1;
        }
    );

    $search4_promise = $client->requestAsync('POST', 'searchCompaniesByIndustries', array(
        'form_params' => $bodyArr,
    ))->then(
        function(ResponseInterface $response) {
            $finished_promisesArr['search4'] = 1;
        },
        function (RequestException $e) {
            $finished_promisesArr['search4'] = 1;
        }
    );

    $promisesAggregate = GuzzleHttp\Promise\all([$search1_promise, $search2_promise, $search3_promise, $search4_promise]);
    foreach ($promisesAggregate as $agg) {
        $curl->tick();
    }

    $keep_running = true;
    while ($keep_running) {
        $all_processes_finished = true;
        foreach ($finished_promisesArr as $promise => $status) {
            if (!$status) {
                $all_processes_finished = false;
            }
        }

        if ($all_processes_finished) {
            $keep_running = false;
        }
    }

    return array();
}

请忽略结果中的空数组以及我没有对响应做任何事情的事实。 我已经获得了服务器方法的日志,甚至没有被调用,循环继续无限运行。

请注意,当我使用request方法而不是requestAsync时,我会得到正确的结果。

这里有什么想法吗?

感谢'!小号

1 个答案:

答案 0 :(得分:0)

$promisesAggregate->wait()函数获取后,只需致电GuzzleHttp\Promise\all

它与您的代码相同,但是正确(您的等待代码只调用->tick()一次,这是错误的。)