Symfony2:从EC2实例缓慢写入S3

时间:2013-12-27 03:33:27

标签: symfony amazon-s3 amazon-ec2

我在同一区域内有1个微实例和S3服务器用于开发目的。我的程序具有以这种方式工作的typeahead功能:

当用户输入“lond”时,网址为:

mys3.s3-website-us-east-1.amazonaws.com/typeahead/cities/lond.json

因为它将返回404,然后javascript尝试:

http://mydomain.com/typeahead/cities/lond.json

这将触发控制器,它将找到以lond开头的所有城市,将其写入S3并返回json结果。

因此,下次有人输入“lond”时,结果会在S3上找到静态文件,并且不会执行任何控制器操作。

现在这一切都有效,但问题是我从EC2到S3的写入速度非常慢。当我删除

$filesystem->write($filename, json_encode($results), true) ;

从我的代码中,响应是~0.7秒。写入S3时,它会达到2秒,这几乎没有用。对于快速打字机,问题更大,可能是因为快速写入发送到S3。

我正在使用KnpGaufretteBundle。

我也试过

echo json_encode($results);
$filename->write(....) ;
die;

将输出发送到浏览器,然后继续将文件保存到S3,但它不起作用。 JS早些时候没有得到回应。

ob_start(),ob_end_flush()....和其他人也没有用。

我该如何解决?

我正在考虑启动一些上传结果的后台流程(虽然我不知道怎么做),但我认为这太复杂了。

另一个想法是直接使用amazon_s3服务并跳过KnpGaufretteBundle,但我想避免这种情况。

1 个答案:

答案 0 :(得分:0)

您似乎要尝试做的是使用s3来存储更好地存储在memcached或其他基于内存的存储中的缓存数据。

我会给你几个其他的选择。如果你愿意,你可以使用两者,但是绰绰有余。

  1. 使用memcached(redis或其他键值存储)和read through缓存。您将使用一个端点,在请求时,将检查缓存中是否存在该值,然后将读取以获取结果(如果不存在)。同时,结果将存储在缓存中。

  2. 使用具有自定义源的云端分发。自定义来源将是您的网站。使用此选项,结果将缓存在cloudfront端点上,持续时间由标头指定。如果文件没有,则每个端点都可以检查文件的来源。为了防止自定义源意外缓存错误的内容,您可能需要检查cloudfront用户代理并允许它只访问某些URL。