使用guzzle发送异步请求而不等待响应

时间:2016-03-12 10:31:36

标签: php asynchronous guzzle guzzle6

我有以下两个功能

public function myEndpoint(){
    $this->logger->debug('Started');
    $this->guzzle->requestAsync('post', 'http://myurl.com/doNotWait')->wait();
    $this->logger->debug("I shouldn't wait");
}

public function doNotWait(){
    sleep(10);
    $this->logger->debug("You shouldn't wait");
}

现在我需要在日志中看到:

Started
I shouldn't wait
You shouldn't wait

但我所看到的

Started
You shouldn't wait
I shouldn't wait

我也尝试使用以下方法:

方式#1

public function myEndpoint(){
    $this->logger->debug('Started');
    $this->guzzle->requestAsync('post', 'http://myurl.com/doNotWait', ['synchronous' => false])->wait();
    $this->logger->debug("I shouldn't wait");
}

方式#2

public function myEndpoint(){
    $this->logger->debug('Started');
    $this->guzzle->requestAsync('post', 'http://myurl.com/doNotWait');

    $queue = \GuzzleHttp\Promise\queue()->run();
    $this->logger->debug("I shouldn't wait");
}

但结果永远不是理想的结果。任何的想法?我正在使用Guzzle 6.x。

3 个答案:

答案 0 :(得分:5)

将其从未答复的清单中删除:

Guzzle不支持“发射并忘记”异步请求,而不会进行深入的黑客攻击。

异步方法是Client::requestAsync()的抽象,它返回一个promise。请参阅https://github.com/guzzle/promises#synchronous-wait - 调用Promise::wait()“用于同步强制完成承诺”。

参考:https://github.com/guzzle/guzzle/issues/1429#issuecomment-197119452

答案 1 :(得分:0)

自从其他人写信以来,Guzzle并未为此提供内置解决方案,因此这里提供了一种解决方案:

$url = "http://myurl.com/doNotWait";
exec("wget -O /dev/null -o /dev/null " . $url . " --background")

它使用exec(https://www.php.net/manual/de/function.exec.php)运行命令行工具wgethttps://de.wikipedia.org/wiki/Wget-它包含在大多数linux发行版中,并且也适用于Windows和OSX)命令。我仅在linux上进行过测试,因此可能必须针对您的OS调整参数。

让它分成几部分

  • -O /dev/null:请求的结果应发送为null(无处)
  • -o /dev/null:日志应发送为空
  • $url:您要调用的网址,例如http://myurl.com/doNotWait
  • --background:在后台运行,请勿等待。

答案 2 :(得分:0)

进行异步调用以创建promise,然后调用then()方法而没有回调

$client = new GuzzleClient();
$promise = $client->getAsync($url)
$promise->then();