20

我有以下两个功能

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。

4

4 回答 4

8

要将其从未答复列表中删除:


Guzzle 不支持没有深度黑客攻击的“即发即弃”异步请求。

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

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

于 2017-06-27T07:56:30.673 回答
0

如果您不关心响应,则应执行以下操作:

try {
    $this->guzzle->post('http://myurl.com/doNotWait', ['timeout' => 1]);
} catch (\GuzzleHttp\Exception\ConnectException $e) {
    // do nothing, the timeout exception is intended
}

所以,这里的请求将需要 1 秒,代码执行将继续。

于 2021-10-21T09:41:42.163 回答
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 上测试过它,所以可能需要为你的操作系统调整参数。

让我们把它分成几部分

  • -O /dev/null: 请求的结果应该被发送到 null (无处)
  • -o /dev/null: 日志应该被发送到 null
  • $url: 你想调用的url,例如http://myurl.com/doNotWait
  • --background: 在后台运行,不要等待。
于 2019-08-08T14:36:24.090 回答
0

进行异步调用以创建承诺,然后调用 then() 方法而不使用回调

$client = new GuzzleClient();
$promise = $client->getAsync($url)
$promise->then();
于 2019-11-14T07:42:18.483 回答