私は次の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を使用しています。
未回答リストから削除するには:
Guzzleは、ディープハッキングなしの「ファイアアンドフォーゲット」非同期リクエストをサポートしていません。
非同期メソッドは、Promiseを返すClient::requestAsync()
の抽象化です。 https://github.com/guzzle/promises#synchronous-wait -Promise::wait()
の呼び出しを参照してください。
参照: https://github.com/guzzle/guzzle/issues/1429#issuecomment-197119452
非同期呼び出しを行ってpromiseを作成し、コールバックなしでthen()メソッドを呼び出します
$client = new GuzzleClient();
$promise = $client->getAsync($url)
$promise->then();
他の人が書いたので、その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 )を使用してコマンドラインツールwget
( https:/ /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
:バックグラウンドで実行し、待機しません。