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

Ben*_*old 54 php fuse amazon-s3 s3fs

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

我已经尝试使用s3fs(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将挂载存储桶,但存储桶中已有的文件都不会出现在文件系统中.

这些是我使用的mount命令:

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
Run Code Online (Sandbox Code Playgroud)

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

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

编辑 我被告知我RioFS在GitHub上打开的问题已经解决.虽然我决定使用S3 REST API而不是尝试将存储桶作为卷安装,但RioFS这些天似乎可能是一个可行的选择.

Bra*_*ncy 51

你有没有在本地linux文件系统上安装S3存储桶?

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

  1. 它不会隐藏错误.文件系统只有一些错误代码可以发送给您以指示问题.S3库将为您提供来自亚马逊的确切错误消息,以便您了解正在发生的事情,记录它,处理角落案例等.
  2. 库将使用更少的内存.文件系统层将缓存大量随机的东西,你再也不会使用它们了.库使您可以控制决定要缓存的内容而不是缓存内容.
  3. 扩张.如果您需要做任何花哨的事情(在文件上设置ACL,生成签名链接,版本控制,生命周期,更改持久性等),那么您将不得不转储文件系统抽象并使用库.
  4. 时间和重试.一些请求随机出错并可以重试.有时您可能想要重试很多次,有时您会很快出错.文件系统不会给你精细控制,但是库会.

底线是FUSE下的S3是漏洞抽象.S3没有(或需要)目录.文件系统不是为数十亿个文件构建的.他们的权限模型不兼容.你试图将它变成文件系统,从而浪费了很多S3的强大功能.

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

https://github.com/KnpLabs/Gaufrette

https://aws.amazon.com/sdkforphp/ - 如果您不仅仅使用S3扩展,或者如果您需要执行上述任何花哨的请求,那么这个非常有用.

  • 泄漏抽象文章的+1! (7认同)