PHP na Windows Azure - Mechanizmy przechowywania danych - blob Udostępnij na: Facebook

Autor: Maciej Wilgucki

Opublikowano: 2011-04-05

 

Pobierz i uruchom

W poprzednim artykule z serii o PHP na Windows Azure zapoznaliśmy się z narzędziem, z którego będziemy korzystać podczas tworzenia aplikacji PHP przeznaczonych do współpracy z Windows Azure. Dowiedzieliśmy się, w jaki sposób tworzy się projekty Windows Azure PDT oraz na co musimy uważać podczas pracy. Dzisiaj od teorii przejdziemy do praktyki i poznamy sposoby korzystania z blobów z poziomu PHP.

Implementacja

Blob (binarylargeobject) jest dowolnym zestawem bitów (danych binarnych). W postaci bloba można przechowywać w Windows Azure dowolne pliki takie jak zdjęcia, muzyka, wideo, archiwa zip, dokumenty tekstowe itp. Wszystkie bloby przechowywane są w specjalnych pojemnikach, nazywanych kontenerami. Można je porównać do katalogów, w których przechowujemy pliki na dysku – jedyną różnicą jest to, że kontenerów nie można zagnieżdżać. Jeśli chcemy przechowywać bloby w strukturze drzewiastej, możemy ją zasymulować poprzez stosowanie w nazwach blobów znaku ukośnika (/).

Bloby w Windows Azure dzielą się na dwa rodzaje – bloby blokowe (blockblobs) oraz bloby stronicowe (pageblobs). Pierwszy rodzaj – blockblobs – są standardowym mechanizmem przechowywania plików. Pageblobs natomiast dają możliwość dostępu do dowolnego miejsca w blobie. Ten rodzaj blobów wykorzystywany jest przede wszystkich w Azure Drive, czyli wirtualnym dysku, który można umieścić w chmurze.

W zależności od rodzaju bloba, obowiązują nas różne ograniczenia. W przypadku blobów blokowych maksymalny rozmiar pojedynczego bloba może wynosić 64MB. Bloby stronicowe pozwalają na przechowywanie aż 1TB danych.

Programistów PHP na pewno zainteresuje możliwość korzystania z blobów w taki sam sposób, jak z „normalnych” strumieni. Windows Azure SDK for PHP dostarcza nowy wrapper, po zarejestrowaniu którego możemy uzyskać dostęp do bloba poprzez dowolną funkcję operującą na strumieniach, np. fopen.

Zanim zaczniemy pracować na blobach, musimy utworzyć dla nich pojemnik. Nie jesteśmy ograniczeni do jednego pojemnika, więc nic nie stoi na przeszkodzie, aby korzystać z większej ich ilości w naszych projektach.

Nazwa kontenera musi spełniać następujące warunki:

  • musi rozpoczynać się od litery lub cyfry,
  • może zawierać tylko litery, cyfry oraz myślniki, przy czym obok siebie nie mogą znaleźć się dwa myślniki,
  • wszystkie znaki muszą być zapisane małymi literami,
  • minimalna długość nazwy to trzy znaki, maksymalna – 63 znaki.

W przypadku blobów jedynym ograniczeniem nazwy jest jej długość, która nie może przekroczyć 1024 znaków.

Informacja

Wszystkie zaprezentowane przykłady korzystają z lokalnego magazynu danych. W produkcyjnych aplikacjach należy podać poprawne dane do konta.

Dane dotyczące konta można zapisać w pliku konfiguracyjnym ServiceConfiguration.cscfg. Dostęp do tych danych zapewnia funkcja azure_getconfig, która jako argument przyjmuje nazwę odpowiedniego ustawienia z pliku konfiguracyjnego.

 

require_once 'Microsoft/WindowsAzure/Storage/Blob.php';

$host = Microsoft_WindowsAzure_Storage::URL_DEV_BLOB;
$accountName = Microsoft_WindowsAzure_Credentials_CredentialsAbstract::DEVSTORE_ACCOUNT;
$accountKey = Microsoft_WindowsAzure_Credentials_CredentialsAbstract::DEVSTORE_KEY;

$containerName = 'kontener';

try {
    $blobStorageClient = newMicrosoft_WindowsAzure_Storage_Blob($host, $accountName, $accountKey);
    $blobStorageClient->createContainerIfNotExists($containerName);
    
    /* kod */
    
} catch (Exception $e) {
    echo $e;
}
Informacja
Poniższe przykłady należy umieszczać w miejscu komentarza /* kod */

Mając gotowy pojemnik, możemy dodać do niego dowolny plik:

   $blobStorageClient->putBlob('kontener', 'nazwa_docelowa.jpg', 'd:\sciezka\do\pliku.jpg');

Na blobach można wykonywać dokładnie takie same czynności jak na standardowych plikach. Możemy je kopiować:

   $blobStorageClient->copyBlob('kontener', 'nazwa_bloba.jpg', 'kontener', 'nowy_blob.jpg');

Usuwać:

   $blobStorageClient->deleteBlob('kontener', 'nazwa_bloba.jpg');

oraz pobierać z kontenera:

   $blobStorageClient->getBlob('kontener', 'nazwa_bloba.jpg', 'C:\sciezka\do\zapisu\plik.jpg');

Na koniec mamy jeszcze możliwość usunięcia kontenera:

   $blobStorageClient->deleteContainer($containerName);

Może zajść potrzeba dodania danych przekraczających maksymalny rozmiar bloba. Twórcy SDK przewidzieli taką sytuację i stworzyli metodę putLargeBlob. Dzieli ona dane na mniejsze bloki, które nie przekroczą maksymalnego rozmiaru, a następnie umieszcza je w kontenerze. Na szczęście nie musimy nic zmieniać w aplikacji, ponieważ metoda putBlob sama wykryje, czy dane, które mamy zamiar zapisać do bloba, przekraczają wyznaczony limit i użyje metody putLargeBlob do wysłania danych.

Wszystkie powyższe operacje są możliwe pod warunkiem, że znamy nazwy kontenerów i blobów. Może zajść jednak taka sytuacja, że bloby posiadają nazwy generowane podczas ich zapisywania, a kontenery tworzone są przez inną rolę. W takim przypadku pomocne okażą się metody listujące kontenery oraz bloby:

// listowanie kontenerów
$containers = $blobStorageClient->listContainers();    
foreach ($containers as $container) {
    echo $container->Name;
}
// listowanie blobów
$blobs = $blobStorageClient->listBlobs($containerName);     
foreach ($blobs as $blob) {
    echo $blob->Name;        
}

Wspomniałem na początku dzisiejszego artykułu również o blobach stronicowanych (pageblobs). Mamy wprawdzie możliwość korzystania z nich bezpośrednio, jednak o wiele lepiej użyć gotowych rozwiązań. Jednym z takich gotowych rozwiązań jest Azure Drive, będący wirtualnym dyskiem dostępnym w chmurze i przechowywanym właśnie jako pageblob.

Dysk wirtualny tworzymy w momencie tworzenia lub edycji roli w zakładce Windows Azure Drives (rys. 1).

Rys. 1. Dodawanie nowego dysku wirtualnego do roli.

 

Po stronie PHP możemy sprawdzić, czy i jakie dyski mamy zamontowane, korzystając z globalnej tablicy $_SERVER. Jeśli jakikolwiek dysk będzie dostępny, pojawi się on pod kluczem X_DRIVES. W przypadku większej ilości dysków będą one oddzielone średnikiem. Każdy dostępny dysk opisany jest dwoma parametrami – literą dysku oraz prawem dostępu. Parametry oddzielone są od siebie przecinkiem. Po uzyskaniu interesującej nas litery dysku możemy pracować z nim w taki sam sposób, jakbyśmy operowali na lokalnym dysku. Jest to o tyle istotne, że możemy przenieść do chmury działającą już aplikację bez konieczności jej modyfikacji.

Na koniec pozostaje ostatnia funkcjonalność oferowana przez bloby – Content Delivery Network (CDN). Jeśli zależy nam na szybkości transferu danych, wówczas możemy skorzystać z tej funkcjonalności. Powoduje ona, że dane dostarczane są użytkownikowi z najbliższej lokalizacji.

Podsumowanie

Poznaliśmy dzisiaj pierwszy z trzech mechanizmów przechowywania danych w Azure Storage – bloby, oraz sposoby na operowanie nimi. Dowiedzieliśmy się, że obok standardowych blobów przechowujących typowe pliki istnieją bloby umożliwiające przechowywanie plików VHD, które mogą służyć jako wirtualny dysk w chmurze.

W następnej części poznamy kolejki, dzięki którym role w naszej aplikacji mogą się ze sobą komunikować.