2013-05-07 94 views
52

我正在致力於在Amazon Web Services上託管的項目。服務器設置包含兩個EC2實例,一個Elastic Load Balancer和一個Web應用程序駐留的額外彈性塊存儲。該項目是假設使用S3存儲用戶上傳的文件。對於這個問題的緣故,我會打電話給S3存儲static.example.com如何將S3存儲桶裝載到EC2實例並使用PHP寫入?

我一直在使用s3fshttps://code.google.com/p/s3fs/wiki/FuseOverAmazon)試過了,RioFShttps://github.com/skoobe/riofs)和s3qlhttps://code.google.com/p/s3ql/)。 s3fs將掛載文件系統,但不會讓我寫入存儲桶(我在SO上問過這個問題:如何使用FUSE以適當的權限掛載S3卷)。 RioFS將掛載文件系統,並讓我從shell寫入存儲桶,但使用PHP保存的文件不會出現在存儲桶中(我在GitHub上打開了一個項目問題)。 s3ql將掛載存儲桶,但文件系統中不會顯示存儲桶中已有的文件。

這些是安裝命令我使用:https://github.com/tpyo/amazon-s3-php-class/這FuelPHP特定S3包:https://github.com/tomschlick/fuel-s3

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類試過。我能夠得到FuelPHP包列出可用的桶和文件,但將文件保存到桶失敗(但沒有錯誤)。

你有沒有在本地Linux文件系統上掛載S3存儲桶,並使用PHP將文件成功寫入存儲桶?您使用了哪些工具?如果您使用上述工具之一,您使用的是哪個版本?

編輯 我被告知,我在GitHub上與RioFS打開問題已得到解決。儘管我決定使用S3 REST API而不是嘗試將一個存儲桶安裝爲卷,但似乎RioFS可能是最近可行的選擇。

+2

爲什麼downvote?我需要更多/更少具體嗎? – 2013-05-07 21:09:39

+1

爲什麼不使用[S3 API](http://aws.amazon.com/documentation/s3/)而不是試圖將其用作文件系統? – 2013-05-07 21:11:03

+0

不是downvoter,但我想知道他/她是否在尋找一大堆你遇到麻煩的代碼。雖然我們確實有一個針對話語問題的政策,但這個問題似乎對我來說足夠具體,所以+1。 – halfer 2013-05-07 21:12:51

回答

48

你有沒有在本地linux文件系統上掛載S3存儲桶?

不是。測試很有趣,但我不會讓它靠近生產系統。使用庫與S3進行通信要好得多。原因如下:

  1. 它不會隱藏錯誤。一個文件系統只有一些錯誤代碼,可以發送給你指出問題。一個S3庫會給你從亞馬遜的確切的錯誤信息,所以你知道發生了什麼,記錄它,處理角落案件等。
  2. 庫將使用較少的內存。 Filesystems圖層將緩存許多隨機的東西,你很多人再也不會使用它。一個庫讓你控制決定緩存什麼和不緩存。
  3. 擴張。如果您需要做任何事情(在文件上設置ACL,生成簽名鏈接,版本控制,生命週期,更改持久性等),那麼您必須轉儲文件系統抽象並使用庫。
  4. 計時和重試。一小部分請求會隨機出錯,並可以重試。有時你可能想重試很多次,有時你寧願快速錯誤。文件系統不會給你精確的控制,但是一個庫會。

底線是在FUSE下的S3是leaky abstraction。 S3沒有(或需要)目錄。文件系統不是爲數十億個文件而構建的。他們的權限模型不兼容。通過嘗試將其硬塞進文件系統,你正在浪費S3的很多力量。對於交談S3

兩個隨機PHP庫:

https://github.com/KnpLabs/Gaufrette

https://aws.amazon.com/sdkforphp/ - 如果你不僅僅是使用S3擴大這個人是有用的,或者如果你需要做上述任何花哨的請求。

+1

我不知道爲什麼我甚至試圖在本地文件系統上安裝S3存儲桶......可能是因爲這是其他人的想法。 – 2013-05-17 18:26:21

+7

+1爲泄漏的抽象文章! – Ricalsin 2013-08-02 17:55:40

+0

我檢查出了Gaufrette,認爲它會讓s3集成更容易,但實際上,亞馬遜的php sdk本身很容易使用。 – targnation 2014-01-15 16:57:21

2

通常,將文件寫入EBS卷是有利的,然後強制後續公共請求文件以通過CloudFront CDN進行路由。

這樣,如果應用程序必須對文件進行任何轉換,則在本地驅動器上執行操作要容易得多,然後強制請求已轉換的文件通過CloudFront從原點獲取請求。

例如如果您的用戶正在上傳頭像的圖片,並且頭像圖片需要幾次迭代以獲得尺寸爲&的裁剪,則您的應用可以在本地捲上創建這些圖片,但該文件的所有公共請求都將通過雲端原點拉取請求發生。通過這種方式,您可以靈活地保留原始文件(或文件的優化版本),並且任何後續用戶請求都可以從雲前端獲取現有版本,或者雲前端將請求發送迴應用並創建任何必要的迭代。

上面的一個基本示例是WordPress,它除了保留原始文件(受文件大小限制和/或插件轉換)之外,還創建了上傳的任何圖形圖像的多個大小/裁剪版本。支持CDN的WordPress插件(如W3 Total Cache)重寫請求以通過CDN,因此該應用程序只需創建獨特的首次請求迭代。添加瀏覽器緩存URL版本(http://domain.tld/file.php?x123)可進一步改進和利用CDN功能。

如果您擔心EBS卷文件大小或inode的快速擴展,您可以對很少請求的文件或老化文件自動執行修剪過程。

相關問題