20

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

4

4 に答える 4

0

他の人が書いたように、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 (nowhere) に送信する必要があります
  • -o /dev/null: ログは null に送信する必要があります
  • $url: 呼び出したい URL、たとえばhttp://myurl.com/doNotWait
  • --background: バックグラウンドで実行します。待機しないでください。
于 2019-08-08T14:36:24.090 に答える