>我有以下两个函数
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 不支持"即发即弃"异步请求,而无需深度黑客攻击。
异步方法是 Client::requestAsync()
的抽象,它返回一个 promise。请参阅 https://github.com/guzzle/promises#synchronous-wait - 调用Promise::wait()
"用于同步强制完成承诺"。
参考: https://github.com/guzzle/guzzle/issues/1429#issuecomment-197119452
如果您不关心响应,则应执行以下操作:
try {
$this->guzzle->post('http://myurl.com/doNotWait', ['timeout' => 1]);
} catch ('GuzzleHttp'Exception'ConnectException $e) {
// do nothing, the timeout exception is intended
}
因此,这里的请求将需要 1 秒,代码执行将继续。
进行异步调用以创建承诺,然后调用 then() 方法而不带回调
$client = new GuzzleClient();
$promise = $client->getAsync($url)
$promise->then();
由于其他人写道,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
:日志应发送到空 -
$url
:要调用的网址,例如http://myurl.com/doNotWait
-
--background
:在后台运行,不要等待。
根据请求,请立即发送并忘记。其中一个解决方案对我有用。
$client = new 'GuzzleHttp'Client(['timeout' => 0.001]);
$promise = $client->requestAsync('GET', 'http://dummy.site');
try {
$promise->wait();
} catch ('Exception $ex) {
## Handle
}
如果未调用$promise->wait();
则未执行请求。