我在同一区域内有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,但我想避免这种情况。
答案 0 :(得分:0)
您似乎要尝试做的是使用s3来存储更好地存储在memcached或其他基于内存的存储中的缓存数据。
我会给你几个其他的选择。如果你愿意,你可以使用两者,但是绰绰有余。
使用memcached(redis或其他键值存储)和read through缓存。您将使用一个端点,在请求时,将检查缓存中是否存在该值,然后将读取以获取结果(如果不存在)。同时,结果将存储在缓存中。
使用具有自定义源的云端分发。自定义来源将是您的网站。使用此选项,结果将缓存在cloudfront端点上,持续时间由标头指定。如果文件没有,则每个端点都可以检查文件的来源。为了防止自定义源意外缓存错误的内容,您可能需要检查cloudfront用户代理并允许它只访问某些URL。