Подтвердить что ты не робот

Отправлять асинхронный запрос, не дожидаясь ответа, используя guzzle

У меня есть следующие две функции:

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.

4b9b3361

Ответ 1

Чтобы получить его из списка без ответа:


Guzzle не поддерживает асинхронные запросы "запускай и забывай" без глубокого взлома.

Асинхронные методы являются абстракциями для Client::requestAsync(), который возвращает обещание. См. https://github.com/guzzle/promises#synchronous-wait - вызов Promise::wait() "используется для синхронного принудительного выполнения обещания".

Ссылка: https://github.com/guzzle/guzzle/issues/1429#issuecomment-197119452

Ответ 2

Поскольку другие писали, что 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: результат запроса должен быть отправлен в ноль (нигде)
  • -o /dev/null: логи должны быть отправлены на ноль
  • $url: URL, который вы хотите назвать, например http://myurl.com/doNotWait
  • --background: Запустите в фоновом режиме, не ждите.