利用 Azure SDK for PHP 使用 Azure 服務

除了關聯式資料庫外,實務上我們常需要將文字檔二進位檔 (圖片檔或影音檔) 上傳到雲端,並提供下載,此時我們可以使用 Azure 的 Blob Storage 儲存這類型的檔案。

Version


PHP 7.0.8
Laravel 5.2.43
PhpStorm 2016.2

Blob Storage 簡介


  • 在雲端中儲存檔案的服務,可儲存任何類型的檔案,包含文字檔與二進位檔。
  • 全球任何地方都可透過 HTTP 或 HTTPS 來存取這些資料。您可以使用 Blob Storage 向全球公開資料,或私下儲存應用程式資料。

Blob Storage 應用


  • 瀏覽器所需的圖片或文件。
  • 檔案的分散式存取。
  • 視訊和音訊的串流傳輸。
  • 檔案備份、歸檔。

Blob Storage 概念


  • Account
    • 需透過 Account 存取 Container 與 Blob。
  • Container
    • 放置 Blob 的地方,類似檔案的資料夾
    • 必須以小寫命名。
  • Blob
    • 任何類型的檔案。

建立 Azure Storage Account


要使用 Azure Blob Storage,首先必須登入 Azure portal,建立 storage account 。

New -> Data + Storage -> Storage account

Replication 快速整理
  • Azure 會自動為 storage account 的資料進行 replication,確保資料的持久性與高可用性。
  • 提供了 4 種 replication 機制 :3 3關於 replication,詳細請參考 Tamra Myers, Azure Storage replication

    1. Locally Redundant Storage (LRS) : 提供本機備援。
    2. Zone-redundant Storage (ZRS) : 提供區域備援。
    3. Geo-redundant Storage (GRS) : 提供異地備援。
    4. Read-access Geo-redundant Storage (RA-GRS) : 提供讀取權限的異地備援。
Replication LRS ZRS GRS RA-GRS
可跨多個設備複寫 No Yes Yes Yes
可從次要位置及主要位置讀取資料 No No No Yes
可在不同的節點上維護的資料副本數量 3 3 6 6
Access Tier 快速整理

預設為 Hot

用途

  • Hot : 適合經常讀、寫的檔案,例如 : 圖檔、文件等。
  • Cool : 適合備份檔案,或不常使用之檔案。

價格

  • Hot : 儲存空間費用較高、存取與交易成本較低。
  • Cool : 儲存空間費用較低、存取與交易成本較高。

  • Resource Group : 可以新建 group,也可以使用目前既有 group,使用 group 的優點是方便管理,若要刪除可以整個 group 一起刪除。
  • Location : 選擇離我們最近的 East Asia

Create 開始建立 storage account。

成功建立 storage account 後,可以在儀表板看到。

安裝 Azure SDK for PHP


Azure 提供了 Azure SDK for PHP,讓我們可以在 PHP 輕鬆地使用 Azure 服務,由於使用了 Composer 管理套件,所以不單 Laravel 可使用,其他 PHP framework 也可以使用。1 1GitHub Commit : 安裝 Azure SDK for PHP

1
oomusou@mac:~/MyProject$ composer require microsoft/windowsazure

建立 Azure Storage 連接字串


剛剛雖然在 Azure portal 建立了 storage account,但 Laravel 還是不知道該如何連上 Azure Storage,我們還必須在 Laravel 建立連接字串,才能存取 Container 與 Blob。

1
DefaultEndpointsProtocol=[http|https];AccountName=[yourAccount];AccountKey=[yourKey]

Azure Storage 連接字串的格式需包含幾個部分 :

  • DefaultEndpointsProtocol : 選擇 httphttps
  • AccountName : Azure Storage account 名稱。
  • AccountKey : Azure Storage account 的 key。
AccountName 與 AccountKey 該填什麼呢?

Settings -> General -> Access Keys

  • Storage account name 即為連接字串的 AccountName
  • key1 即為連接字串的 AccountKey

在 Laravel 的 .env 建立以 AZURE_STORAGE 為 key 的連接字串。4 4GitHub Commit : 建立 Azure Storage 連接字串

建立 Container


以 TDD 方式使用 Azure SDK for PHP

AzureBlobServiceUnitTest.php5 5GitHub Commit : 單元測試 : 建立 Container

tests/AzureBlobServiceUnitTest.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
use App\Services\AzureBlobService;

class AzureBlobServiceUnitTest extends TestCase
{

/** @var AzureBlobService */
protected $target;

protected function setUp()
{

parent::setUp();
$this->target = App::make(AzureBlobService::class);
}

/** @test */
public function 建立Container()
{

/** arrange */

/** act */
$containerName = 'mycontainer';
$actual = $this->target->createContainer($containerName);

/** assert */
$expected = true;
$this->assertEquals($expected, $actual);
}
}

第 5 行

1
2
3
4
5
6
7
8
/** @var AzureBlobService */
protected $target;

protected function setUp()
{

parent::setUp();
$this->target = App::make(AzureBlobService::class);
}

AzureBlobService 建立待測試的 $target 物件。

14 行

1
2
3
4
5
6
7
8
9
10
11
12
13
/** @test */
public function 建立Container()
{

/** arrange */

/** act */
$containerName = 'mycontainer';
$actual = $this->target->createContainer($containerName);

/** assert */
$expected = true;
$this->assertEquals($expected, $actual);
}

  • Arrange : 由於不需要 mock 與假資料,所以 arrange 部分暫時從缺。
  • Act : 建立待測 method createContainer(),傳入 Container 名稱。
  • Assert : 期望建立 Container 成功傳回 true

AzureBlobService.php6 6GitHub Commit : 建立 Container

app/Services/AzureBlobService.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
namespace App\Services;

use MicrosoftAzure\Storage\Blob\Internal\IBlob;
use MicrosoftAzure\Storage\Common\ServiceException;
use WindowsAzure\Common\ServicesBuilder;

class AzureBlobService
{

/** @var string */
protected $storageConnectionString;
/** @var IBlob */
protected $blobProxy;

/**
* AzureBlobService constructor.
*/

public function __construct()
{

$this->storageConnectionString = env('AZURE_STORAGE');
$this->blobProxy = ServicesBuilder::getInstance()->createBlobService($this->storageConnectionString);
}

/**
* 建立 Container
* @param string $containerName
* @return bool
*/

public function createContainer(string $containerName) : bool
{

try {
$this->blobProxy->createContainer($containerName);
} catch (ServiceException $exception) {
echo $exception->getCode() . ':' . $exception->getMessage();
return false;
}

return true;
}
}

第 9 行

1
2
3
4
5
6
7
8
9
10
11
12
13
/** @var string */
protected $storageConnectionString;
/** @var IBlob */
protected $blobProxy;

/**
* AzureBlobService constructor.
*/

public function __construct()
{

$this->storageConnectionString = env('AZURE_STORAGE');
$this->blobProxy = ServicesBuilder::getInstance()->createBlobService($this->storageConnectionString);
}

env() 讀取剛剛在 .env 建立的 AZURE_STORAGE 連接字串。

Azure SDK for PHP 所提供的 ServiceBuilder::getInstance()createBlobService() 在本機建立 $blobProxy 物件,傳入 Azure Storage 連接字串。

23 行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* 建立 Container
* @param string $containerName
* @return bool
*/

public function createContainer(string $containerName) : bool
{

try {
$this->blobProxy->createContainer($containerName);
} catch (ServiceException $exception) {
echo $exception->getCode() . ':' . $exception->getMessage();
return false;
}

return true;
}

透過 $blobProxy 物件的 createContainer() 建立 Container。

若 Container 建立失敗 (如重複建立 Container ),將丟出 ServiceException

測試 綠燈,建立 Container 成功。

Azure portal 也能看到剛剛所建立的 Container。

建立 Blob


AzureBlobServiceUnitTest.php7 7GitHub Commit : 單元測試 : 建立 Blob

tests/AzureBlobServiceUnitTest.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
use App\Services\AzureBlobService;

class AzureBlobServiceUnitTest extends TestCase
{

/** @var AzureBlobService */
protected $target;

protected function setUp()
{

parent::setUp();
$this->target = App::make(AzureBlobService::class);
}

/** @test */
public function 建立Blob()
{

/** arrange */

/** act */
$containerName = 'mycontainer';
$blobName = 'myblob';
$content = fopen(__DIR__ . '/blob.txt', 'r');
$actual = $this->target->createBlob($containerName, $blobName, $content);

/** assert */
$expected = true;
$this->assertEquals($expected, $actual);
}
}

14 行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/** @test */
public function 建立Blob()
{

/** arrange */

/** act */
$containerName = 'mycontainer';
$blobName = 'myblob';
$content = fopen(__DIR__ . '/blob.txt', 'r');
$actual = $this->target->createBlob($containerName, $blobName, $content);

/** assert */
$expected = true;
$this->assertEquals($expected, $actual);
}

  • Arrange : 由於不需要 mock 與假資料,所以 arrange 部分暫時從缺。
  • Act : 建立待測 method createBlob(),傳入 Container 名稱、Blob 名稱與上傳物件。
  • Assert : 期望建立 Blob 成功傳回 true

AzureBlobService.php8 8GitHub Commit : 建立 Blob

app/Services/AzureBlobService.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
namespace App\Services;

use MicrosoftAzure\Storage\Blob\Internal\IBlob;
use MicrosoftAzure\Storage\Common\ServiceException;
use WindowsAzure\Common\ServicesBuilder;

class AzureBlobService
{

/** @var string */
protected $storageConnectionString;
/** @var IBlob */
protected $blobProxy;

/**
* AzureBlobService constructor.
*/

public function __construct()
{

$this->storageConnectionString = env('AZURE_STORAGE');
$this->blobProxy = ServicesBuilder::getInstance()->createBlobService($this->storageConnectionString);
}

/**
* 建立 Blob
* @param string $containerName
* @param string $blobName
* @param $content
* @return bool
*/

public function createBlob(string $containerName, string $blobName, $content) : bool
{

try {
$this->blobProxy->createBlockBlob($containerName, $blobName, $content);
} catch (ServiceException $exception) {
echo $exception->getCode() . ':' . $exception->getMessage();
return false;
}

return true;
}
}

23 行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* 建立 Blob
* @param string $containerName
* @param string $blobName
* @param $content
* @return bool
*/

public function createBlob(string $containerName, string $blobName, $content) : bool
{

try {
$this->blobProxy->createBlockBlob($containerName, $blobName, $content);
} catch (ServiceException $exception) {
echo $exception->getCode() . ':' . $exception->getMessage();
return false;
}

return true;
}

透過 $blobProxy 物件的 createBlockBlob() 建立 Blob。

若 Blob 建立失敗,將丟出 ServiceException

測試 綠燈,建立 Container 成功。

Azure portal 也能看到剛剛所建立的 Blob。

顯示所有 Blob


AzureBlobServiceUnitTest.php9 9GitHub Commit : 單元測試 : 顯示所有 Blob

tests/AzureBlobServiceUnitTest.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
use App\Services\AzureBlobService;

class AzureBlobServiceUnitTest extends TestCase
{

/** @var AzureBlobService */
protected $target;

protected function setUp()
{

parent::setUp();
$this->target = App::make(AzureBlobService::class);
}

/** @test */
public function 顯示所有Blob()
{

/** arrange */

/** act */
$containerName = 'mycontainer';
$actual = $this->target->listAllBlobs($containerName)->all();

/** assert */
$expected = [
['name' => 'myblob', 'url' => 'https://laravel52blobstorage.blob.core.windows.net/mycontainer/myblob']
];
$this->assertEquals($expected, $actual);
}
}

14 行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/** @test */
public function 顯示所有Blob()
{

/** arrange */

/** act */
$containerName = 'mycontainer';
$actual = $this->target->listAllBlobs($containerName)->all();

/** assert */
$expected = [
['name' => 'myblob', 'url' => 'https://laravel52blobstorage.blob.core.windows.net/mycontainer/myblob']
];
$this->assertEquals($expected, $actual);
}

  • Arrange : 由於不需要 mock 與假資料,所以 arrange 部分暫時從缺。
  • Act : 建立待測 method listAllBlobs(),傳入 Container 名稱。
  • Assert : 建立期望回傳的的陣列做 assertion。

AzureBlobService.php10 10GitHub Commit : 顯示所有 Blob

app/Services/AzureBlobService.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
namespace App\Services;

use MicrosoftAzure\Storage\Blob\Internal\IBlob;
use MicrosoftAzure\Storage\Common\ServiceException;
use WindowsAzure\Common\ServicesBuilder;

class AzureBlobService
{

/** @var string */
protected $storageConnectionString;
/** @var IBlob */
protected $blobProxy;

/**
* AzureBlobService constructor.
*/

public function __construct()
{

$this->storageConnectionString = env('AZURE_STORAGE');
$this->blobProxy = ServicesBuilder::getInstance()->createBlobService($this->storageConnectionString);
}

/** 列出 Container 的所有 Blob
* @param string $containerName
* @return Collection
*/

public function listAllBlobs(string $containerName) : Collection
{

try {
/** @var ListBlobsResult $blobLists */
$blobLists = $this->blobProxy->listBlobs($containerName);
$blobs = $blobLists->getBlobs();

return collect($blobs)->map(function (Blob $blob) {
return [
'name' => $blob->getName(),
'url' => $blob->getUrl(),
];
});
} catch (ServiceException $exception) {
echo $exception->getCode() . ':' . $exception->getMessage();
return collect([]);
}
}
}

23 行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/** 列出 Container 的所有 Blob
* @param string $containerName
* @return Collection
*/

public function listAllBlobs(string $containerName) : Collection
{

try {
/** @var ListBlobsResult $blobLists */
$blobLists = $this->blobProxy->listBlobs($containerName);
$blobs = $blobLists->getBlobs();

return collect($blobs)->map(function (Blob $blob) {
return [
'name' => $blob->getName(),
'url' => $blob->getUrl(),
];
});
} catch (ServiceException $exception) {
echo $exception->getCode() . ':' . $exception->getMessage();
return collect([]);
}
}

透過 $blobProxy 物件的 listBlobs() 取得 $blobLists 物件,在由其 getBlobs() 取得所有 Blob 陣列。

若 Blob 取得失敗,將丟出 ServiceException

測試 綠燈,顯示所有 Blob 成功。

下載 Blob


AzureBlobServiceUnitTest.php11 11GitHub Commit : 單元測試 : 下載 Blob

tests/AzureBlobServiceUnitTest.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
use App\Services\AzureBlobService;

class AzureBlobServiceUnitTest extends TestCase
{

/** @var AzureBlobService */
protected $target;

protected function setUp()
{

parent::setUp();
$this->target = App::make(AzureBlobService::class);
}

/** @test */
public function 下載Blob()
{

/** arrange */

/** act */
$containerName = 'mycontainer';
$blobName = 'myblob';
$actual = $this->target->downloadBlob($containerName, $blobName);

/** assert */
$expected = true;
$this->assertEquals($expected, $actual);
}
}

14 行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/** @test */
public function 下載Blob()
{

/** arrange */

/** act */
$containerName = 'mycontainer';
$blobName = 'myblob';
$actual = $this->target->downloadBlob($containerName, $blobName);

/** assert */
$expected = true;
$this->assertEquals($expected, $actual);
}

  • Arrange : 由於不需要 mock 與假資料,所以 arrange 部分暫時從缺。
  • Act : 建立待測 method downloadBlob(),傳入 Container 名稱與 Blob 名稱。
  • Assert : 期望下載 Blob 成功傳回 true

AzureBlobService.php12 12GitHub Commit : 下載 Blob

app/Services/AzureBlobService.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
namespace App\Services;

use MicrosoftAzure\Storage\Blob\Internal\IBlob;
use MicrosoftAzure\Storage\Common\ServiceException;
use WindowsAzure\Common\ServicesBuilder;

class AzureBlobService
{

/** @var string */
protected $storageConnectionString;
/** @var IBlob */
protected $blobProxy;

/**
* AzureBlobService constructor.
*/

public function __construct()
{

$this->storageConnectionString = env('AZURE_STORAGE');
$this->blobProxy = ServicesBuilder::getInstance()->createBlobService($this->storageConnectionString);
}

/**
* 下載 Blob
* @param string $containerName
* @param string $blobName
* @return bool
*/

public function downloadBlob(string $containerName, string $blobName) : bool
{

try {
/** @var GetBlobResult $blob */
$blob = $this->blobProxy->getBlob($containerName, $blobName);
fpassthru($blob->getContentStream());
} catch (ServiceException $exception) {
echo $exception->getCode() . ':' . $exception->getMessage();
return false;
}

return true;
}
}

23 行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* 下載 Blob
* @param string $containerName
* @param string $blobName
* @return bool
*/

public function downloadBlob(string $containerName, string $blobName) : bool
{

try {
/** @var GetBlobResult $blob */
$blob = $this->blobProxy->getBlob($containerName, $blobName);
fpassthru($blob->getContentStream());
} catch (ServiceException $exception) {
echo $exception->getCode() . ':' . $exception->getMessage();
return false;
}

return true;
}

透過 $blobProxy 物件的 getBlob() 取得 $blob 物件,在由其 getContentStream() 以串流資源形式取得 Blob。

若 Blob 取得失敗,將丟出 ServiceException

測試 綠燈,並顯示文字檔內容為 Hello Azure Blob

刪除 Blob


AzureBlobServiceUnitTest.php13 13GitHub Commit : 單元測試 : 刪除 Blob

tests/AzureBlobServiceUnitTest.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
use App\Services\AzureBlobService;

class AzureBlobServiceUnitTest extends TestCase
{

/** @var AzureBlobService */
protected $target;

protected function setUp()
{

parent::setUp();
$this->target = App::make(AzureBlobService::class);
}

/** @test */
public function 刪除Blob()
{

/** arrange */

/** act */
$containerName = 'mycontainer';
$blobName = 'myblob';
$actual = $this->target->deleteBlob($containerName, $blobName);

/** assert */
$expected = true;
$this->assertEquals($expected, $actual);
}
}

14 行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/** @test */
public function 刪除Blob()
{

/** arrange */

/** act */
$containerName = 'mycontainer';
$blobName = 'myblob';
$actual = $this->target->deleteBlob($containerName, $blobName);

/** assert */
$expected = true;
$this->assertEquals($expected, $actual);
}

  • Arrange : 由於不需要 mock 與假資料,所以 arrange 部分暫時從缺。
  • Act : 建立待測 method deleteBlob(),傳入 Container 名稱與 Blob 名稱。
  • Assert : 期望刪除 Blob 成功傳回 true

AzureBlobService.php14 14GitHub Commit : 刪除 Blob

app/Services/AzureBlobService.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
namespace App\Services;

use MicrosoftAzure\Storage\Blob\Internal\IBlob;
use MicrosoftAzure\Storage\Common\ServiceException;
use WindowsAzure\Common\ServicesBuilder;

class AzureBlobService
{

/** @var string */
protected $storageConnectionString;
/** @var IBlob */
protected $blobProxy;

/**
* AzureBlobService constructor.
*/

public function __construct()
{

$this->storageConnectionString = env('AZURE_STORAGE');
$this->blobProxy = ServicesBuilder::getInstance()->createBlobService($this->storageConnectionString);
}

/**
* 刪除 Blob
* @param string $containerName
* @param string $blobName
* @return bool
*/

public function deleteBlob(string $containerName, string $blobName) : bool
{

try {
$this->blobProxy->deleteBlob($containerName, $blobName);
} catch (ServiceException $exception) {
echo $exception->getCode() . ':' . $exception->getMessage();
return false;
}

return true;
}
}
}

23 行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* 刪除 Blob
* @param string $containerName
* @param string $blobName
* @return bool
*/

public function deleteBlob(string $containerName, string $blobName) : bool
{

try {
$this->blobProxy->deleteBlob($containerName, $blobName);
} catch (ServiceException $exception) {
echo $exception->getCode() . ':' . $exception->getMessage();
return false;
}

return true;
}

透過 $blobProxy 物件的 deleteBlob() 刪除 Blob。

若 Blob 取得失敗,將丟出 ServiceException

測試 綠燈,刪除 Blob 成功。

Azure portal 已經看不到任何 Blob。

刪除 Container


AzureBlobServiceUnitTest.php15 15GitHub Commit : 單元測試 : 刪除 Container

tests/AzureBlobServiceUnitTest.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
use App\Services\AzureBlobService;

class AzureBlobServiceUnitTest extends TestCase
{

/** @var AzureBlobService */
protected $target;

protected function setUp()
{

parent::setUp();
$this->target = App::make(AzureBlobService::class);
}

/** @test */
public function 刪除Container()
{

/** arrange */

/** act */
$containerName = 'mycontainer';
$actual = $this->target->deleteContainer($containerName);

/** assert */
$expected = true;
$this->assertEquals($expected, $actual);
}
}

14 行

1
2
3
4
5
6
7
8
9
10
11
12
13
/** @test */
public function 刪除Container()
{

/** arrange */

/** act */
$containerName = 'mycontainer';
$actual = $this->target->deleteContainer($containerName);

/** assert */
$expected = true;
$this->assertEquals($expected, $actual);
}

  • Arrange : 由於不需要 mock 與假資料,所以 arrange 部分暫時從缺。
  • Act : 建立待測 method deleteContainer(),傳入 Container 名稱。
  • Assert : 期望刪除 Container 成功傳回 true

AzureBlobService.php16 16GitHub Commit : 刪除 Container

app/Services/AzureBlobService.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
namespace App\Services;

use MicrosoftAzure\Storage\Blob\Internal\IBlob;
use MicrosoftAzure\Storage\Common\ServiceException;
use WindowsAzure\Common\ServicesBuilder;

class AzureBlobService
{

/** @var string */
protected $storageConnectionString;
/** @var IBlob */
protected $blobProxy;

/**
* AzureBlobService constructor.
*/

public function __construct()
{

$this->storageConnectionString = env('AZURE_STORAGE');
$this->blobProxy = ServicesBuilder::getInstance()->createBlobService($this->storageConnectionString);
}

/**
* 刪除 Container
* @param string $containerName
* @return bool
*/

public function deleteContainer(string $containerName) : bool
{

try {
$this->blobProxy->deleteContainer($containerName);
} catch (ServiceException $exception) {
echo $exception->getCode() . ':' . $exception->getMessage();
return false;
}

return true;
}
}

23 行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* 刪除 Container
* @param string $containerName
* @return bool
*/

public function deleteContainer(string $containerName) : bool
{

try {
$this->blobProxy->deleteContainer($containerName);
} catch (ServiceException $exception) {
echo $exception->getCode() . ':' . $exception->getMessage();
return false;
}

return true;
}

透過 $blobProxy 物件的 deleteContainer() 刪除 Container。

若 Blob 取得失敗,將丟出 ServiceException

測試 綠燈,刪除 Container 成功。

Azure portal 已經看不到任何 Container。

Conclusion


  • Azure 提供了 Blob Storage,讓我們可以方便地儲存文字檔或二進位檔。
  • Azure 還提供了 Azure SDK for PHP,使用了 Composer 的套件管理方式,只要簡單的 composer require 後即可立即使用,且不限於 Laravel,其他 PHP framework 也可以使用。

Sample Code


完整的範例可以在我的 GitHub 上找到。

Reference


2016-08-13