首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AWS SDK (PHP):异步调用lambda函数,检索状态

问AWS SDK (PHP):异步调用lambda函数,检索状态
EN

Stack Overflow用户
提问于 2016-06-28 13:40:49
回答 1查看 4.1K关注 0票数 4

我们有一个AWS函数,用于在_down_load之前进行一些可怕的专有文件格式处理和自定义,这是通过AWS从PHP触发的。lambda从s3桶中抓取文件,向文件中插入一些元数据,对其进行压缩,并将其放在临时存储桶中,以便在客户签出时下载。

lambda部件通过调用/invokeAsync完美地工作。

代码语言:javascript
复制
use Aws\Sdk;
...
$lambdaclient = $this->sdk->createClient('lambda',$region);

$syncresult = $lambdaclient->invoke([
    'FunctionName' => $functionName,
    'InvocationType' => 'RequestResponse',
    'Payload' => json_encode($payload),
]);

$asyncresult = $lambdaclient->invoke([
    'FunctionName' => $functionName,
    'InvocationType' => 'Event',
    'Payload' => json_encode($payload),
]);

$promise = $lambdaclient->invokeAsync([
    'FunctionName' => $functionName,
    'Payload' => json_encode($payload),
]);
  • $syncresult将包含lambda函数的成功/失败状态,可以选择使用日志(通过LogType尾)。

问题是lambda可能需要一分钟才能完成,这对于PHP来说返回浏览器的响应是相当长的时间。

  • $asyncresult将调用该函数,并返回HTTP 202,但以后无法检查该函数是否实际执行了任何操作。
  • $promise是AWS广泛使用的一个口香糖承诺,一个函数可以绑定在PHP中,以便在lambda完成时执行。这似乎非常有用,只要PHP不向浏览器返回响应,因为此时您将失去承诺。您可以调用$result = $promise->wait()让它解决。这些承诺的主要优点似乎是并发运行多个lambda,并将结果组合在一个PHP请求中。

我想要的是异步调用函数,并在以后的PHP请求中检查函数状态(可能在会话数据中存储一些对调用的引用?)。这样,我可以在稍后使用Ajax请求轮询状态,并确保当我创建一个签名的s3 URL到最终文件时,所有内容都没有错误地完成。

使用AWS可以做到这样的事情吗?还是有更好的解决方案?

编辑:

我已经决定使用从客户端ajax调用触发的invokeAsync,该调用被中止(而不是等待答案)。PHP脚本获得了相当长的完成时间(使用setTime分别),因为对lambda的调用同时运行,浏览器也不再等待了。

我将承诺存储在数组中,并使用:

代码语言:javascript
复制
$values = array_map(function($result){
    return json_decode($result->toArray()['Payload']->getContents());
}, Promise\unwrap($promises));

为了获得响应有效负载(它们被AWS封装在流接口中),并将它们写走(在我的例子中,DynamoDB通过SQL/session/cache可能都能工作)。

当最终用户需要结果时,我只是简单地检查存储的数据以及转换后的文件是否存在于s3上。

我可能会改进ajax处理,方法是使用刷新PHP的输出缓冲区,使用一些返回的ID正确地完成调用,同时允许PHP等待AWS的承诺。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-28 15:47:28

是的,你可以做到这一点,但我不确定你是否可以完全用兰博达。我对待它的方式是:

1)当您的当前PHP代码被点击时,add使用AWS SNS发送一条包含函数和参数详细信息的消息。立即向浏览器返回一条消息,其中包含要在s3中监视的文件的信息。然后让您的浏览器轮询我在步骤3中描述的端点。

2)设置lambda函数以侦听SNS消息并自动运行(http://docs.aws.amazon.com/sns/latest/dg/sns-lambda.html)

3)可以使用AJAX访问另一个PHP端点,检查lambda创建的文件是否已经创建完毕。如果没有返回一条尚未准备好的消息,那么一旦文件出现,就返回一条表示它已经准备好的消息。

如果您不想使用纯AWS方法,那么您可以这样做:

1)当您的当前PHP代码被击中时,向数据库表中添加一条记录,其中包含需要运行的函数和参数以及类似于queued的状态。立即将数据库中记录的id发回浏览器。然后让您的浏览器轮询我在步骤3中描述的端点。

2)设置一个连续运行或通过cron或其他方式触发的单独php脚本,该脚本每隔几秒钟检查一次上面创建的具有queued状态的表的条目。将记录状态更新为类似于processing的内容,这样就不会意外地再次运行。现在让它触发Lambda函数并使用承诺。完成后,将记录状态更新为complete。

3)有另一个PHP端点,您可以使用AJAX将步骤1中接收的id传递给它,然后只返回记录的状态。一旦浏览器返回complete的状态,它就知道文件可以下载了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38077883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档