Php 对Amazon Firehose的异步请求
是否可以异步向AWS发送请求?真正意义上的 如果我试图以以下方式发送邮件,则不会发送邮件:Php 对Amazon Firehose的异步请求,php,aws-sdk,guzzle,Php,Aws Sdk,Guzzle,是否可以异步向AWS发送请求?真正意义上的 如果我试图以以下方式发送邮件,则不会发送邮件: $firehose = new FirehoseClient($args); /** @var Promise\Promise $promise */ $promise = $firehose->putRecordAsync($record); $promise->then(function ($result) { echo
$firehose = new FirehoseClient($args);
/** @var Promise\Promise $promise */
$promise = $firehose->putRecordAsync($record);
$promise->then(function ($result) {
echo 'test';
});
但当我在脚本末尾添加:
$promise->wait()
它起作用了,但是同步的。有没有办法使它异步
我还尝试使用不同的处理程序:
$curl = new CurlMultiHandler();
$handler = HandlerStack::create($curl);
$args = [
'http_handler' => $handler,
'region' => '#REGION#',
'version' => 'latest',
'credentials' => $credentials,
'debug' => true
];
$firehose = new FirehoseClient($args);
while (!Promise\is_settled($promise)) {
$curl->tick();
}
基本上它可以工作,但始终处于同步模式。我需要的是向AWS发送一个请求,而不是等待答复。我没有在PHP中使用异步代码,但我在Python中使用了这些代码 从一般的理解来看,同步代码所包围的单个异步请求并不能带来任何好处。您应该在完全异步的环境中工作(即,您需要某种外部事件循环)。看起来是其中之一 此外,您还可以从同时发出多个API请求并一起等待它们中获益。如本例所示,它的工作速度将快于连续进行几个同步调用
我希望它能有所帮助。解决问题的最佳方法是使用事件循环实现,例如ReactPHP 不幸的是,Guzzle(更好地说,cURL本身)不适合在开箱即用的事件循环中工作 就我个人而言,我通过实现一个对运行Guzzle查询事件循环友好的方法解决了一个同样的问题。请看一看 因此,代码可以如下所示:
run(function ($loop) use ($genFn) {
$httpHandler = new CurlMultiHandler($loop);
$stack = HandlerStack::create($httpHandler);
$httpClient = new Client([
'handler' => $stack,
]);
$promise = $httpClient->getAsync('https://google.com')->then(
function ($result) { echo 'Query completed!'; },
function ($reason) { echo 'Query failed.'; }
);
/*
* The promise isn't completed yet, but the event loop will take care of it.
* We don't need to call Promise::wait()!
*/
});
php不是异步的您可以尝试使用rabbit mq,或者使用Queue通过cron调用脚本我知道php不是异步的,但是有一个curl函数:curl\u multi\u exec,它应该能够在后台发送请求?此外,我应该如何理解AWS官方文档:。似乎应该有某种异步方式。如果我错了,请纠正我。@Roman,在PHP中添加了生成器(协同程序)之后,有可能用事件循环编写异步代码。你能给我一些链接,让我可以更详细地阅读这些内容吗?我没有任何好的链接可以推荐。但是你可以用以下关键词进行谷歌搜索:async generator io/event loop php:)我在搜索结果中看到的第一个链接看起来很有助于深入理解你可能需要在GitHub上看到一些实现。它似乎比标准wait()好,但我认为它不是完全异步的。当您在run()函数的and处放置一些打印函数(即print('TEST')时,您可以看到它正在等待一段时间来打印它。如果我错了,请纠正我。我只想向Amazon Firehose发送一些数据,我不想在发送进程/请求上浪费任何时间,但我觉得即使在run()结束时以这种方式进程脚本正在等待一段时间来发送所有数据。