[php] Amazon S3 Programming

未分類

因為主機有異地備份的需求
所以找了一下相關的資料






這是一個用 php 寫的 amazon S3 的 class
用法還滿簡單的


$endpoint = 's3-ap-northeast-1.amazonaws.com';
$bucket_name = 'your_bucket_name';
$use_ssl = false;

$s3 = new S3($awsAccessKey, $awsSecretKey, $use_ssl, $endpoint);
s3->putObjectFile($local_filename, $bucket_name, $remote_filename, S3::ACL_PUBLIC_READ);
unset($s3);



以上動作就可以把一個本地的檔案塞到遠端去

$awsAccessKey 跟 $awsSecretKey
是存取 S3 的一對資料 (類似帳號密碼)
有些可以存取S3的 ftp 軟體也會需要這對資料

只要把這個key pair給別人
別人就可以存取你的S3

$bucket_name 是 bucket 的名稱 (廢話)
S3 沒有什麼多層目錄的概念
在你的帳號下 只能建立類似 "籃子" 的容器
然後你可以把檔案都丟在這個籃子裡
所以 $bucket_name 就是寫入你要存取的籃子的名稱

至於籃子 可以先在 S3 用網頁介面開好
也可以用 API 去開
可自行研究 bucket 相關的函數

再來是 endpoint
因為 S3 在世界各地有數個 data center
你可以選擇距離你自己主機近的 data center
不過每個 data center 的費用計算都不一樣
(美國是最便宜的)

如果你是用預設的 data center
則在 建構子的地方不需要指定 endpoint
可以只寫這樣

$s3 = new S3($awsAccessKey, $awsSecretKey);

我是因為好玩 開了一個 tokyo 的 bucket
結果連線的時候就噴了錯誤訊息
(訊息也看不懂)

後來查了一下才發現
原來要指定 bucket 相對的 endpoint
如果你開了一個其他地方的 endpoint
但是在 new 的時候沒有指定
他就會用美國的 endpoint 去操作
然後就會噴錯誤...

endpoint 可以到這個網址查詢

第三個參數是是否要用 SSL
就看有沒有需要

最後就是 putObjectFile 這個 function
主要就是把檔案放上去
指定本地檔案路徑跟檔案名稱 (fullpath)
要放的 bucket, 遠端的檔案名稱, 還有存取權限
就可以了

我的需求是寫虛擬主機幫客戶備份資料的功能
本來想說挑離 VPS 近的 endpoint
但是後來想想
傳輸比較快也沒什麼特別意義
反正傳的完就好了
想想還是用美國的 endpoint 就好了

Amazon S3 的服務算是滿便宜的
他有三種收費項目
一個是容量大小
一個是資料傳輸(只收傳出的流量)
最後一個是存取次數 (一千次以下免費)
而且是用越多越便宜

因為我是備份服務
所以大部分都是放進去
很少拿出來
然後存取次數又少
所以幾乎只有被收容量的費用

另外也有直接把 S3 掛載在本地磁碟的應用方法
我試了好幾個版本 掛載成功
但是 ls 就出現錯誤訊息...
還沒研究出來是什麼問題
不然當做本地端存取
事情應該會簡單很多