PHP on Microsoft Azure開發實戰(四) - 使用 Microsoft Azure Storage – Blob storage 處理靜態檔案

更新

簡介

Microsoft Azure Storage 是 Microsoft Azure 平台上面提供永久性資料儲存服務,除了前一篇介紹的 SQL Database 之外,還有用於儲存檔案(正確地說是BLOB)的「Blob 儲存服務」,還有可以用來儲存 Key-Value 資料的「Table 儲存服務」,這篇文章將先針對「Blob 儲存服務」的使用來做介紹。

這一系列文章包括:

  1. PHP 應用程式執行環境
  2. 部署PHP應用程式
  3. 資料庫的選擇: MySQL or SQL Database
  4. 使用Microsoft Azure Storage – Blob storage處理靜態檔案
  5. 使用 Microsoft Azure Storage – Table Service處理Session物件
  6. 使用 Microsoft  Azure Service Bus與其它系統進行通訊
  7. 實例說明:簡單購物網站實例

Microsoft Azure Blob 儲存服務簡介

Microsoft Azure Blob 儲存服務主要是提供儲存大量的純文字或二進位的資料,在儲存體上的每一筆資料物件就好像檔案系統上的檔案一般。儲存在 Microsoft Azure Blob儲存體上的資料都可以透過URL存取(透過驗證或完全公開),並且擁有下列特性:

  • 目前一個 Microsoft Azure Blob 儲存體可以提供最多 200TB 的儲存空間(根據使用量計費)。
  • 一個 Microsoft Azure 訂閱帳號最多可以建立 5 個 Microsoft Azure Blob 儲存體。
  • 可以選擇是否跨區域資料備援(預設會在單一區域內儲存多份資料複本以確定可靠度)
  • 可以透過 RESTful Web Service 的方式操作資料的 CRUD(Create, Read, Update, Delete)
  • 提供資料存取的監控及記錄

你的 PHP 應用程式不一定要放在 Microsoft Azure 上才能使用 Microsoft Azure Blob 儲存服務,由於能透過 RESTful Web Service 或是 Microsoft Azure SDK for PHP 的方式存取,即便是在自己的 hosting 上也可以使用,通常在下列幾種情況下較適合使用 Blob 儲存體服務:

  • Hosting環境的永久儲存空間有限或是根本沒有永久儲存空間

    Microsoft Azure 網站服務在免費及共享方案下僅提供 1GB 的永久性儲存空間(基本方案 10GB、標準方案為 50GB),而 Microsoft Azure 雲端服務則是完全沒有永久性儲存空間,在這樣的狀況之下,都不建議應用程式假設執行環境中有個檔案系統可以直接操作,也就是要儲存不是放在資料庫中的資料就不應該使用檔案來處理,而是可以將它儲存在 Microsoft  Azure Blob儲存服務這樣的雲端儲存平台。

    而且把應用程式中關於檔案的操作抽離到雲端平台之後,執行環境變單純了,在部署到異質平台,或是要搬 hosting 時就會更方便了。

  • 避免檔案下載大量吃掉網站頻寬

    即使你覺得PHP應用程式執行環境有足夠的永久性儲存空間,但若你的應用程式裡許多檔案都放在同一個環境,而且是透過同樣的 domain 來下載,在用戶在下載大檔案吃掉輸出頻寬,或是同時下載大量檔案(如載入一個頁面時同時載入 CSS、JavaScript 或圖片檔案)佔掉過多的連線等等狀況都會對資源造成耗損,這時候把檔案放在 Microsoft Azure Blob 儲存體上,就可以有效減緩這些問題。

安裝 Microsoft Azure SDK for PHP

Microsoft  Azure 團隊也提供了一套給 PHP 應用程式使用的 Microsoft Azure SDK,並且將此 SDK 的原始碼公開在 GitHub 上,同時可參考在該頁面上的說明來選擇安裝 SDK 的方法(Git、PEAR 或 Composer )。透過 SDK 來存取 Microsoft  Azure Blob 儲存服務就不必自己處理 RESTful Web Service 的呼叫。

接下來的文章都會使用 SDK 的方式來操作 Microsoft Azure Blob 儲存服務。

情境:將網頁前端用到的靜態檔案放在 Blob 儲存體

在許多網頁前端加速的建議文章中,都會建議將網頁前端中會用到的靜態檔案(如:CSS、JavaScript、圖檔等非程式檔案)放在與網站不同的網域下(參考:High Performance Websites 的 Rule 8: Make JavaScript and CSS External 的例子),以增加瀏覽器平行下載的數量(因為瀏覽器針對單一網域會限制平行下載的數量)。

做法很簡單,可以在 Microsoft Azure Blob儲存服務中先建立一個公開存取的容器(container)


在 Microsoft Azure 管理後台中的儲存體可以直接建立容器(container)


可以根據需求建立公開或非公開的容器

這樣一來,若你的儲存體帳戶名稱叫 ericishandsome,那這個容器的 URL 會是:https://ericishandsome.blob.core.windows.net/assets/ ,放在該容器裡的資料(檔案)也就會follow 這個 URL,比方說在這這個容器下的 foo.js 資料,那它的完整 URL 便為:https://ericishandsome.blob.core.windows.net/assets/foo.js

而要把資料放在容器裡,除了可以用程式上傳(後面會介紹)之外,也可以使用一些工具來上傳檔案,比方說 Windows Azure Storage Explorer 是一個不錯 Microsoft Azure儲存服務的管理工具:


填入儲存服務的帳號還有管理金鑰(可於後台取得)即可操作


可以上傳下載刪除或修改檔案資料

情境:處理上傳的檔案

如果網頁中要處理用戶上傳檔案,原本也許會使用像 move_uploaded_file 函式將上傳的檔案儲存至另一個檔案路徑,像是這樣:

這樣一來便可以透過 $path 的值來存取檔案,但如果我們想將上傳的檔案上傳到Blob儲存體,可以改寫成:

這樣一來,上傳後的檔案若容器是公開的,就可以透過 URL (根據儲存體帳號、容器名稱,以及上傳資料的名稱來決定)來存取該檔案。

情境:提供使用者下載檔案

如同前面所提過的,如果你的網站提供了下載檔案的服務,而不希望這些下載檔案的操作吃掉你 hosting 的頻寬,那麼可以運用 Blob 儲存體來處理。如果你有一些檔案已經存放在 Blob 儲存體上並不公開,而是希望使用者通過一些驗證機制再下載,那麼可以這麼做:

  1. 在 PHP 應用程式端驗證使用者的身份或是下載授權
  2. 驗證成功後,產生 SAS (Shared Access Signatures)
  3. 組合出加上 SAS 的 URL 讓使用者從 Microsoft Azure Blob 儲存體下載檔案

假設我們要讓使用者下載的 private blob URL 為 **https://ericishandsome.blob.core.windows.net/dl/foo.pdf**,因為是 private 用戶無法直接從這個 URL 直接存取,那產生 SAS 以及用戶可以下載到檔案的 URL 如下所示:

從上面這段程式碼的例子,雖然原本的資料不是公開直接存取,但我們產生了一個一小時內有效(可調整)的 SAS 作為 query string 暫時開放給用戶下載,這樣就能完成許多應用了。