我们有一个AWS函数,用于在_down_load之前进行一些可怕的专有文件格式处理和自定义,这是通过AWS从PHP触发的。lambda从s3桶中抓取文件,向文件中插入一些元数据,对其进行压缩,并将其放在临时存储桶中,以便在客户签出时下载。
lambda部件通过调用/invokeAsync完美地工作。
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),
]);问题是lambda可能需要一分钟才能完成,这对于PHP来说返回浏览器的响应是相当长的时间。
$result = $promise->wait()让它解决。这些承诺的主要优点似乎是并发运行多个lambda,并将结果组合在一个PHP请求中。我想要的是异步调用函数,并在以后的PHP请求中检查函数状态(可能在会话数据中存储一些对调用的引用?)。这样,我可以在稍后使用Ajax请求轮询状态,并确保当我创建一个签名的s3 URL到最终文件时,所有内容都没有错误地完成。
使用AWS可以做到这样的事情吗?还是有更好的解决方案?
编辑:
我已经决定使用从客户端ajax调用触发的invokeAsync,该调用被中止(而不是等待答案)。PHP脚本获得了相当长的完成时间(使用setTime分别),因为对lambda的调用同时运行,浏览器也不再等待了。
我将承诺存储在数组中,并使用:
$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的承诺。
发布于 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的状态,它就知道文件可以下载了。
https://stackoverflow.com/questions/38077883
复制相似问题