我有以下两个功能
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。
答案 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)运行命令行工具wget
(https://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();