web-dev-qa-db-ja.com

guzzleを使用して応答を待たずに非同期要求を送信する

私は次の2つの機能を持っています

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を使用しています。

20
gmponos

未回答リストから削除するには:


Guzzleは、ディープハッキングなしの「ファイアアンドフォーゲット」非同期リクエストをサポートしていません。

非同期メソッドは、Promiseを返すClient::requestAsync()の抽象化です。 https://github.com/guzzle/promises#synchronous-wait -Promise::wait()の呼び出しを参照してください。

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

6
cweiske

非同期呼び出しを行ってpromiseを作成し、コールバックなしでthen()メソッドを呼び出します

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

他の人が書いたので、そのGuzzleはこのための組み込みソリューションを提供していません、これが1つのライナーとしてのソリューションです:

$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:ログはnullに送信する必要があります
  • $url:呼び出したいURL、たとえばhttp://myurl.com/doNotWait
  • --background:バックグラウンドで実行し、待機しません。
0
bernhardh