如何将S3存储桶装载到EC2实例并使用PHP写入?

我正在开发一个在Amazon Web Services上托pipe的项目。 服务器设置包含两个EC2实例,一个Elastic Load Balancer和一个Web应用程序所在的额外弹性块存储。 该项目应该使用S3来存储用户上传的文件。 为了这个问题,我将调用S3 bucket static.example.com

我曾尝试使用RioFS ( https://code.google.com/p/s3fs/wiki/FuseOverAmazon ), RioFS ( https://github.com/skoobe/riofs )和s3ql ( https://code.google。 com / p / s3ql / )。 s3fs将挂载文件系统,但不会让我写入存储桶(我在SO问这个问题:我如何使用FUSE以适当的权限挂载一个S3卷)。 RioFS将挂载文件系统,并让我从shell写入存储桶,但使用PHP保存的文件不会出现在存储桶中(我在GitHub上打开了一个项目的问题)。 s3ql将装入存储桶,但文件系统中没有任何已经存在的文件。

这些是我使用的安装命令:

 s3fs static.example.com -ouse_cache=/tmp,allow_other /mnt/static.example.com riofs -o allow_other http://s3.amazonaws.com static.example.com /mnt/static.example.com s3ql mount.s3ql s3://static.example.com /mnt/static.example.com 

我也试过使用这个S3类: https : //github.com/tpyo/amazon-s3-php-class/和这个FuelPHP特定的S3包: https : //github.com/tomschlick/fuel-s3 。 我能够得到FuelPHP包列出可用的桶和文件,但将文件保存到桶失败(但没有错误)。

你有没有在本地linux文件系统上挂载一个S3存储桶,并使用PHP将文件成功写入存储桶? 你使用了什么工具? 如果您使用上述工具之一,您使用的是什么版本?

编辑我被告知,我在GitHub上用RioFS打开的问题已经解决。 虽然我决定使用S3 REST API,而不是试图将一个桶装入卷,但似乎现在的RioFS可能是一个可行的select。

你有没有在本地linux文件系统上挂载一个S3存储桶?

不,testing很有趣,但我不会让它靠近生产系统。 使用库与S3进行通信要好得多。 原因如下:

  1. 它不会隐藏错误。 一个文件系统只有一些错误代码,它可以发送给你指出一个问题。 一个S3图书馆会给你从亚马逊的确切的错误消息,所以你知道发生了什么事,login,处理angular落案件等。
  2. 一个库将使用更less的内存。 Filesystems图层将caching许多随机的东西,你很多人再也不会使用。 一个库让你控制决定什么caching和不caching。
  3. 扩张。 如果你需要做任何事情(在一个文件上设置一个ACL,生成一个签名链接,版本控制,生命周期,改变持久性等),那么你将不得不转储文件系统抽象,并使用一个库。
  4. 计时和重试。 请求中的一部分随机出错,可以重试。 有时候你可能想重试很多次,有时你宁愿快点错误。 一个文件系统不会给你粒度控制,但一个库会。

底线是FUSE下的S3是一个漏洞抽象 。 S3没有(或需要)目录。 文件系统不是为数十亿个文件而构build的。 他们的权限模式不兼容。 试图把它放到文件系统中,你正在浪费S3的许多力量。

与S3交谈的两个随机PHP库:

https://github.com/KnpLabs/Gaufrette

https://aws.amazon.com/sdkforphp/ – 如果您扩展的不仅仅是使用S3,或者您需要执行上面提到的任何特殊请求,那么这个是非常有用的。

通常,将文件写入EBS卷是有利的,然后强制后续公共请求文件通过CloudFront CDN路由。

这样,如果应用程序必须对文件进行任何转换,则在本地驱动器和系统上执行操作要容易得多,然后强制请求已转换的文件通过CloudFront从原始位置获取请求。

例如,如果您的用户正在上传图片作为头像,并且头像图片需要多次迭代以进行大小和裁剪,则您的应用可以在本地卷上创build这些图片,但是该文件的所有公开请求都将通过云端原点拉取请求。 通过这种方式,您可以灵活地保留原始文件(或文件的优化版本),并且任何后续用户请求都可以从云前端获取现有版本,或者云前端将请求发送回应用并创build任何必要的迭代。

上面的一个基本的例子是WordPress,除了保留原始文件(受文件大小限制和/或插件转换)之外,它还创build了上传的任何graphics图像的多个大小/裁剪版本。 支持CDN的WordPress插件(如W3 Total Cache)重写了通过CDN的请求,所以应用程序只需要创build唯一的第一次请求迭代。 添加浏览器cachingURL版本( http://domain.tld/file.php?x123 )将进一步改进和利用CDNfunction。

如果您担心EBS卷文件大小或inode的快速扩展,则可以自动执行修剪过程以处理很less请求的文件或老化的文件。