你好,游客 登錄
背景:
閱讀新聞

六合图库发财玄机图:使用 PHP 向 Amazon 分載多媒體內容和帶寬

[日期:2009-02-25] 來源:ibm   作者:Jack D. Herrington [字體: ]

六合图库118万众图库 www.xorsm.icu Web 2.0 的出現帶來了 Web 上多媒體的普及。Flikr 剛剛推出幾個星期,就有幾百萬張圖片得到了它的服務。Web 1.0 郵票大小的視頻也已經被 Google Video 或 YouTube 上瀏覽器大小的電影所取代。但是,這會讓小型 PHP 應用程序的開發人員如何適從呢?當您想要承載大量的圖像和巨大的視頻文件時會出現什么情況?您那個只需支付 9 美元的托管帳號能提供所有必需的空間和帶寬么?為您提供托管服務的公司的 Internet 連接能滿足通信流量要求么?可能不行。

  幸運的是,Amazon 找到了補救的方法,就是利用一種全新的客戶級 Web 服務:遠程存儲。只需花費很少費用,您就可以在 Amazon 上托管和存儲數十億字節任何類型的數據。您可將該空間用來存儲站點的圖像,也可使用 Amazon 保存備份。

  在本文中,我將通過一組 PHP 頁面來使用 Amazon S3 托管多媒體文件。盡管還不盡完善,但 Amazon 還是通過提供幾個上傳和檢索內容的方法大大簡化了該流程。

  關于 Amazon S3 的更多信息

  使用 Amazon S3 存儲服務比較容易。從 Amazon Web Services (AWS) 開始,選擇想要的存儲服務,并單擊 Subscribe。在那兒設置付費機制 —— 通常使用信用卡 —— 也可以使用您用來在 Amazon 上購買書或 DVD 的卡。每上傳或下載十億字節的數據,Amazon 就會給您的卡記一次帳。設置完存儲以后,您將會收到一封電子郵件,里面含有一個鏈接,通過該鏈接可以獲得您的帳戶 ID 和密鑰。

  有兩個關鍵的概念您必須理解:桶(bucket)和對象。一個桶 就像硬盤上的一個目錄。一個對象 就是一個桶中的一個指定的數據塊??稍諂渲寫娣湃魏文不兜畝?,這也正是 Amazon 使用對象 而不使用文件 的原因。對于本例來說,我將上傳圖像文件到 Amazon S3,因此,每個對象就相當于一個文件。

Amazon S3 支持使用多種方法創建、編輯和刪除桶以及其中的對象。如果偏好 SOAP,您可以使用它?;蛘?,如這里的例子中那樣,采用 Representational State Transfer (REST) 協議,使用 curl 命令行工具將 GET、PUT 和 DELETE 命令通過 HTTP 發送到 Amazon S3 服務器。PUT 命令創建桶或對象,DELETE 刪除桶或對象,GET 檢索有關桶或來自對象的數據的信息。

  對象可擁有幾個級別的訪問控制。就我們的目的而言,其中的兩種需要特別關注:私有(只有桶的擁有者才能讀取其內容)和公有可讀(任何人都可以讀取但不能修改其內容)。我將使用公有可讀選項,以便使用 Amazon S3 來提供圖像。圖像的 URL 的格式為://[bucketname].s3.amazonaws.com/[object] 或 //s3.amazonaws.com/[bucketname]/[object] 。在我這個圖像上傳應用程序例子中,一個上傳圖像的 URL 將類似于://jherr_photos.s3.amazonaws.com/IMG_2912.jpg,這種格式十分清晰易讀。

  示例應用程序

  我將要創建的應用程序比較簡單。我會建一個頁面,其中有用來接受文件的表單。然后將該頁面提交到一個上傳頁面,上傳頁面將一個內容為圖像的新對象添加到 Amazon S3 的桶中。此概念如圖 1 所示。

  圖 1. 上傳圖像到 Amazon S3

使用 PHP 向 Amazon 分載多媒體內容和帶寬

  事實上,該腳本實際并不關心我上傳的是什么內容。它只是將文件的內容 —— 以及從上載文件中獲取的關聯 MIME 類型 ——發送到 Amazon S3。因此我可以上傳電影或任何我喜歡的東西。

  當我在 Amazon S3 上存有一些圖像時,另一個頁面將展示桶的內容。此概念如圖 2 所示。

圖 2. 圖像頁面的數據流

使用 PHP 向 Amazon 分載多媒體內容和帶寬

  要記住的重要一點是,HTML 頁面數據來自我的服務器,但圖像數據來自 Amazon S3。是的,我需要向 Amazon 支付帶寬費用。但我也同時獲得了 Amazon 大量的數據管道、數據中心冗余和它所有的基礎設施,而這些是 PHP 托管服務所不能提供的。因此對于大型數據文件,比如電影類型的圖像,承載數據的服務器的可靠性以及 Internet 管道的大小就顯得非常重要。

  上傳頁面

  創建這個應用程序的第一步是設置一個 Amazon S3 帳號。在那之后,所要做的就是獲取一些用來連接到 Amazon S3 服務的 PHP 代碼。不幸的是,當前不論是 Amazon 還是 PEAR 都沒有提供針對 PHP 的 Amazon S3 類。因此,我四處搜尋,終于從 Geoff Gaudreault 找到了能夠處理所有基礎功能的一個 Amazon S3 類。該源代碼由于太長的緣故沒有被作為清單包含在此,但它在 下載 部分可找到。

  Gaudreault 的這個 Amazon S3 類需要您安裝 PEAR 的 Crypt_HMAC ???,因此第三步是使用以下命令安裝該??椋?/P>

% pear install Crypt_HMAC

  完成該操作后,編輯 Gaudreault 的 s3.class.php 文件,將 AWS key 和密鑰包含進去。密鑰用來加密請求的某些部分,以使 Amazon 能夠確保是您編寫的代碼在向他們發送請求。因為是付費服務,最好不要將密鑰給任何人。

  要開始實現,您需要一個帶有表單的頁面來進行文件上傳。

  清單 1. Index.php

<html>
<body>
<form enctype="multipart/form-data" action="upload.php" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="2000000" />
<input type="file" name="file" />
<input type="submit" value="Upload" />
</form>
</body>
</html>

上傳頁面顯示在瀏覽器中。

  圖 3. 上傳頁面

使用 PHP 向 Amazon 分載多媒體內容和帶寬

  index.php 腳本將文件提交到一個上傳頁面。

  清單 2. Upload.php

<?php
require( "s3.class.php" );
$srvc = new S3();
$srvc->putBucket( 'jherr_photos' );
$tmpfile = 'tmpfile';
move_uploaded_file( $_FILES['file']['tmp_name'], $tmpfile );
chmod( $tmpfile, 0777 );
$fh = fopen( $tmpfile, 'rb' );
$contents = fread( $fh, filesize( $tmpfile ) );
fclose( $fh );
$srvc->putObject( $_FILES['file']['name'], $contents,
 'jherr_photos', 'public-read',
 $_FILES['file']['type'] );
unlink( $tmpfile );
?>

  首先,包含 Amazon S3 PHP 庫。然后創建一個 Amazon S3 對象并構建包含對象的桶。Amazon S3 足夠友好,如果已存在一個桶,它將完全忽視構建另一個桶的請求。因此在第一次運行此代碼后,桶的創建請求將被忽視。

  創建桶后,將上傳文件移動到一個您可以閱讀它并更改其權限的位置以便獲取其內容。然后將整個文件讀取到 $contents 變量中。此后,使用 S3 對象將文件添加到桶中。如果同名文件已存在,則該文件的內容會被完全取代。在此腳本的最后,刪除臨時的上傳文件。

  檢索圖像

  下一步是在 Web 頁面上實際查看上傳圖像。要完成此操作,必須構建另一個稱作 list.php 的 PHP 腳本。

清單 3. List.php

<?php
require( "s3.class.php" );
$srvc = new S3();
$resp = $srvc->getBucket( 'jherr_photos' );
preg_match_all( "/<Key>(.*?)</Key>/", $resp, $found );
?>
<html><body><table>
<?php foreach( $found[1] as $key ) { ?>
<tr><td>
<img
src="//jherr_photos.s3.amazonaws.com/<?php echo($key) ?>" />
</td></tr><?php } ?>
</table></body></html>

  該腳本首先包含庫和創建 S3 對象。然后使用 getBucket() 方法來獲取桶的當前內容。該信息作為包含 XML 代碼的一個字符串返回。XML 代碼中有很多內容,但最重要的是文件名,它們被存儲在 <Key> 標記中??梢允褂?XML 解析器讀出 <Key> 標記,但在本例中使用一個正則表達式會更為容易。

  有了所找到的 <Key> 標記的數組后,創建一張表,表中每一行都有單一一個圖像標記,該標記使用源中的文件名。要測試此過程,我上傳了幾張我和我家人的圣誕照片,然后轉到 list.php 頁面。結果如下所示。

  圖 4. 帶有來自 Amazon S3 的照片的列表頁面

使用 PHP 向 Amazon 分載多媒體內容和帶寬

  我將之看作是 Amazon S3 樣例的 HelloWorld 版。它要多簡單有多簡單。雖然我可以使用命令行腳本,但在瀏覽器中查看它更有意思。從本例您可以看到使用 Amazon S3 是多么容易。

缺陷

  本例表面上看起來很簡單,實際上 S3 類中包含了大量的復雜處理。大多數 Web 請求相對簡單,問題一般都出在請求的簽名部分。Amazon 需要使用一個只有您知道的密鑰對每個請求進行簽名。而該簽名過程十分不易處理,也很難調試。所幸的是,S3 類隱藏了這些復雜性。

  手邊有了 S3 類,簽名過程就不是問題了。但如果真遇到了問題,為了解決它,您常常需要系統地查閱文檔和使用 Amazon 簽名工具的幫助,這可能會花費您一兩個小時的時間。在那之后,使用 Amazon S3 服務及其姊妹服務 —— Amazon Simple Queue Service (SQS) —— 就容易了。

  Amazon S3 的世界

  Amazon S3 只是位于一個更大的上下文中的一組服務之一。其他兩個與 Amazon S3 特別相關的服務是 Amazon SQS 及 Amazon Elastic Compute Cloud (EC2)。

  Amazon SQS 可以通過指定隊列讓應用程序得以相互通信,在該隊列中,應用程序根據各種事件(例如,“添加一個用戶”、“請求報告”)插入消息,其他應用程序讀取并處理那些消息,然后將其從隊列中刪除。此功能與 TIBCO 提供的服務類似,可用于允許企業應用程序以一種松散方式進行耦合。

  Amazon EC2 服務,在寫作本文時還處于測試階段,它允許以一種隨需應變的方式使用 Amazon 服務器池的計算功能。您可以創建應用程序的一個 Amazon 機器鏡像(Amazon Machine Image),然后將該鏡像上傳到 Amazon S3。之后向 Amazon EC2 服務發出啟動流程、停止流程和監控流程的請求。如果您已經編寫應用程序來利用此功能的話,定會驚訝于它所提供的強大的隨需應變的處理能力。

  如果將所有三種服務看作一個包 —— 將 Amazon S3 用作磁盤、將 Amazon SQS 用作消息底板,將 Amazon EC2 用作過程管理系統,那么 Amazon 想要做什么就很清楚了。Amazon 想要成為為小型和中型業務提供隨需應變的計算能力的供應商。到那時,從 Amazon EC2 系統使用 Amazon S3 將會免費。

  結束語

  Amazon S3 除了分載站點的一部分帶寬以外,還可用來做其他很多事情,比如:

  備份 使用 Amazon S3 存儲數據庫的夜間備份。Amazon 的 S3Curl 命令行腳本可很容易地用來進行此類處理。 共享存儲 您不再需要使用 USB 驅動器,而是可以創建一個 Amazon S3 文件夾,然后使用工具,比如 Jungle Disk(它將 Amazon S3 像硬盤一樣掛載),創建文件的共享存儲庫。之后,您就可在自己的計算機間或自己與組員之間使用此存儲庫。您甚至可在自己與遠程 Web 服務器之間使用它。 小型 Web 站點 通過將 HTML 和圖像上傳到 Amazon S3,您只需花很少費用就可在 Amazon S3 上托管靜態的小型 Web 站點。 播客、視頻博客或圖像博客 使用 Amazon S3,可上傳播客媒體文件及 RSS V2.0 XML 并可直接在 Amazon S3 上運行播客。

  越使用 Amazon S3,我就越喜歡它。界面簡單,系統可靠。更好的是,價格可以承受。嘗試一下 Amazon S3 看看是否可在自己的 Web 應用程序中使用它。

推薦 打印 | 錄入: | 閱讀:
相關新聞      
本文評論   
評論聲明
  • 尊重網上道德,遵守中華人民共和國的各項有關法律法規
  • 承擔一切因您的行為而直接或間接導致的民事或刑事法律責任
  • 本站管理人員有權保留或刪除其管轄留言中的任意內容
  • 本站有權在網站內轉載或引用您的評論
  • 參與本評論即表明您已經閱讀并接受上述條款