Guzzle异步方法不会异步触发HTTP请求

时间:2018-04-19 17:19:27

标签: php guzzle guzzle6

我的慢速慢功能需要大约20秒才能运行,HTTP请求需要3.4秒才能运行。

我想:

  1. 触发异步HTTP请求(应该几乎为0,因为我不等待响应)
  2. 然后运行慢功能(~20s)
  3. 然后在结束时获取HTTP请求的结果。 (应该几乎为0,因为我现在应该收到响应,因为HTTP请求是异步完成的)
  4. 如果HTTP请求是异步完成的,则步骤1& 3应该几乎没有时间完成。

    我使用了以下代码:

    $client = new Client();
    
    $promise = $client->getAsync('http://www.fakeresponse.com/api/?sleep=3')->then(
        function (ResponseInterface $res) {
            return \GuzzleHttp\json_decode($res->getBody()->getContents(), true);
        },
        function (RequestException $e) {
            throw $e;
        }
    );
    
    // Slow function
    $start = microtime(true);
    $this->slowFunction(); // ~20s
    dump($end); 
    
    $start = microtime(true);
    $promise->wait();
    $end = microtime(true) - $start;
    dump($end); // Should be 0 if running async
    

    输出了什么:

    19.018649101257
    3.3757498264313
    

    这意味着第3步需要大约3.4秒才能运行,这意味着->getAsync没有触发HTTP请求。它会在->wait上启动它。

    如何异步触发HTTP请求?

1 个答案:

答案 0 :(得分:0)

你可以使用pthreads lib来解决与php异步的问题,作为使用示例:

<?php

class MyThread extends Thread{
    public $promise;
    public $terminated;
    public function __construct($promise) {
        $this->terminated=false;
        $this->promise=$promise;
    }
    public function run(){
        $this->promise->wait();
        $this->terminated=true;
    }
}



$client = new Client();

$promise = $client->getAsync('https://www.foaas.com/version')->then(
    function (ResponseInterface $res) {
        return \GuzzleHttp\json_decode($res->getBody()->getContents(), true);
    },
    function (RequestException $e) {
        throw $e;
    }
);

$start = microtime(true);
print $start;
$thread = new MyThread($promise);
while(!$thread->terminated){
    usleep(1);
}
$end = microtime(true) - $start;
print " - ".$end;