PHP e Computação em Nuvem com Zend_Cloud

Posted on outubro 24, 2011. Filed under: PHP, Tuning, Zend Framework |

Muito se fala hoje me dia sobre computação em nuvem. Gostaria de abordar esse tema junto com a linguagem PHP. Nuvens oferecem ilimitados recursos para sua aplicação. Você tem diversas opções disponíveis de plataformas Cloud: Amazon, Rackspace, Microsoft, Google e diversas outras. A maioria delas oferecem dois tipos de serviços em Cloud, IaaS (Infrastructure-as-a-Service) e PaaS (Platform-as-a-Service):

IaaS (Infrastructure-as-a-Service) – As máquinas virtuais estão sob seu total controle. Você tem acesso root e portanto toda manutenção/instalação esta em sua responsabilidade. Incluíndo também o firewall, balanceamento, etc.

PaaS (Platform-as-a-Service) – Abordagem também através de máquinas virtuais. Porém o controle da infraestrutura não é sua responsabilidade. Você se preocupa somente com o desenvolvimento de sua aplicação. Para que isso seja possível, a plataforma de cloud computing disponibiliza APIs para que você possa interagir com a plataforma. Normalmente as APIs são disponibilizadas através de protocolo REST via WebService. Windows Azure, Amazon são exemplos desse tipo de arquitetura.

SimpleCloud

Como já citamos anteriormente temos diversas opções de plataformas para cloud. Cada uma dessas opções tem suas próprias APIs para interação com a plataforma. Gostaria de chamar atenção aqui para o projeto da Zend chamado SimpleCloud que tem o objetivo de fornecer uma camada de abstração para as APIs das plataformas de computação em nuvem. A boa notícia é que esse projeto transformou-se em um componente do Zend Framework, chamado Zend_Cloud. Baixe a última versão do Zend Framework para poder utilizar esse recurso.

Amazon

Como citei anteriormente, o Zend_Cloud fornece uma camada de abstração para plataformas de Cloud Computing. Portanto vamos utilizar os serviços de Cloud da Amazon como backend para os teste deste artigo. Poderíamos usar o Windows Azure ou outra opção disponpivel, porém neste artigo vamos trabalhar com a Amazon. Antes de continuar, será necessário criar uma conta no AWS da Amazon (gratuito). Acesse o link para criar sua conta.

Após criar a conta você precisará obter seu AWS Key e AWS Secret Key que serão utilizados para acessar os serviços de Cloud quer iremos ver mais adiante. Para obter as chaves, acesse o link Account -> Security Credentials.

Serviço de Storage

O serviço de Storage permite armazenar qualquer tipo de dados em qualquer hora de qualquer parte da web. Os tipos de armazenagem normalmente são imagens, arquivos para download, vídeos, distribuição de arquivos temporários, etc. Para disponibilizar os dados para usuários da sua aplicação, você pode disponibilizar links diretos, ou você pode construir um aplicação para intermediar o acesso. Lembre-se que aqui não deve ser armazenado arquivos da sua aplicação, mas arquivos para o usuário. (imagens, vídeos, arquivos para download, etc.)

O serviço de storage do Amazon chamá-se Amazon S3. Você precisa habilitar esse serviço na sua conta do Amazon. Para isso acesse o link abaixo:

http://aws.amazon.com/s3/

Você precisa informar um número de cartão de crédito válido. Você não será cobrado até que o serviço seja utilizado. Como estamos usando para testes, o valor cobrado será mínimo. Para você ter uma idéia, para testar os exemplos utilizados neste artigo gastei somente $0,03. No próprio link acima você pode consultar as tabelas de preço para esse serviço.

Para começar a armazenar seus arquivos no storage será necessário criar aquilo que chamamos de bucket. Todos dados são armazenados em buckets. Pense no bucket como se fosse um driver separado em seu computador. Lembre-se também que um bucket esta em um namespace compartilhado com todos os outros usuários do Amazon S3, portanto o nome do bucket tem que ser único.

Os arquivos armazenados no bucket são chamados de objetos. Podemos manter uma estrutura hierarquica dos objetos dentro dos buckets como se eles estivessem dentro de diretórios, como por exemplo, chamando o objeto de imagens/zend-logo.png.

Vamos criar o bucket através do console de gerenciamento da Amazon. Poderíamos ter feito através de código PHP utilizando sua API, porém vamos usar o console para facilitar nossa tarefa. Logado no site da Amazon com seu usuário, acesse o console de gerenciamento do S3 e crie o seu bucket clicando no botão Create Bucket.

Agora que temos um bucket, podemos criar nosso script php para inserir arquivos dentro do S3. Primeiro crie o arquivo cloud.ini onde iremos parametrizar os dados para acessar o storage. Dessa forma, você não precisa inserir esses dados em todos scripts que você for trabalhar com o Zend_Cloud:

cloud.storage_adapter="Zend_Cloud_StorageService_Adapter_S3"
cloud.aws_accesskey="XXXXXXXXXXXXXXXXXXXX"
cloud.aws_secretkey="1234567890123456789012345678901234567890"
cloud.bucket_name="pasquati"

Abaixo é o código usado para inserir arquivos no Storage da Amazon. Neste exemplo, estamos inserindo um logotipo do Zend Framework.

<?php
/* includes */
require_once ("Zend/Cloud/StorageService/Factory.php");
require_once ("Zend/Cloud/StorageService/Adapter.php");
require_once ("Zend/Config/Ini.php");

/* carregar as configuracoes para o Zend_Cloud  */
$config = new Zend_Config_Ini('cloud.ini');

/* instancia do storage */
$storage = Zend_Cloud_StorageService_Factory::getAdapter($config->cloud);

/*
 * nome do objeto (id) que sera inserido no storage
 * Quando precisarmos acessar esse objeto utilizaremos esse nome
 */
$caminhoArquivo = 'imagens/zend-logo.png';

/* conteudo do arquivo que sera enviado ao storage */
$data = file_get_contents('zend-logo.png');

/*
 * inserindo o objeto no storage.
 * setamos permisao de leitura para todos usarios
 */

$storage->storeItem($caminhoArquivo, $data, array(
        Zend_Cloud_StorageService_Adapter_S3::METADATA => array(
            Zend_Service_Amazon_S3::S3_ACL_HEADER => Zend_Service_Amazon_S3::S3_ACL_PUBLIC_READ,
        )
));

echo "Arquivo enviado ao storage com sucesso!\r\n";

Por padrão, ao inserirmos um arquivo dentro do storage, ele possui permissões de leitura e gravação somente para o nosso usuário. Porém, no exemplo anterior, setamos permissão que qualquer pessoa na web possa acessar o nosso arquivo. Caso você queira disponibilizar os arquivos do storage na web, a URL deve ser montada de acordo com o modelo abaixo:

http://<bucket-name>.s3.amazonaws.com/imagens/zend-logo.png

ou

http://s3.amazonaws.com/<bucket-name>/imagens/zend-logo.png

Podemos também fazer o download dos arquivos do storage através de um script php. Segue abaixo exemplo do código que fará o download do logo da zend e o armazenará em disco.

<?php
/* includes */
require_once ("Zend/Cloud/StorageService/Factory.php");
require_once ("Zend/Cloud/StorageService/Adapter.php");
require_once ("Zend/Config/Ini.php");

/* carregar as configuracoes para o Zend_Cloud  */
$config = new Zend_Config_Ini('cloud.ini');

/* instancia do storage */
$storage = Zend_Cloud_StorageService_Factory::getAdapter($config->cloud);

/*
 * nome do objeto (id) que sera obtido do storage
 */
$caminhoArquivo = 'imagens/zend-logo.png';

/* obtendo os dados do arquivo a partir do storage */
$dados = $storage->fetchItem($caminhoArquivo);

/* salvando o arquivo restaurado em disco */
file_put_contents("zend-logo-restaurado.png", $dados);

echo "Arquivo recebido do storage com sucesso!\r\n";

Document Service

O componente Document Service do Zend_Cloud abstrai funcionalidades do serviços como Amazon SimpleDB e Azure Table Storage. Conhecido como “bancos de documentos” são fontes de dados categorizados como banco de dados não-relacionais. É uma estrutura desenvolvida especificamente para alta perfomance, escabilidade e flexibilidade. O usuário não precisa se preocupar com administração do banco de dados mais, preocupa-se somente com o desenvolvimento da aplicação.

Para utilizar o Document Service fornecido pela Amazon, registre-se através do link http://aws.amazon.com/simpledb/.

Para utilizar o serviço configure o cloud.ini da seguinte forma:

cloud.document_adapter="Zend_Cloud_DocumentService_Adapter_SimpleDb"
cloud.aws_accesskey="XXXXXXXXXXXXXXXXXXXX"
cloud.aws_secretkey="1234567890123456789012345678901234567890"

Primeiramente iremos criar um collection onde iremos armazenar dados. Pense em collections como se fossem tabelas em um banco de dados relacional.

<?php
/* includes */
require_once ("Zend/Cloud/DocumentService/Factory.php");
require_once ("Zend/Cloud/DocumentService/Adapter.php");
require_once ("Zend/Config/Ini.php");

/* carregar as configuracoes para o Zend_Cloud  */
$config = new Zend_Config_Ini('cloud.ini');

/* instancia do DocumentService */
$adapter = Zend_Cloud_DocumentService_Factory::getAdapter($config->cloud);

/* cria collection */
$adapter->createCollection("usuarios");

echo "Collection criada com sucesso \r\n";

Após criado o collection, podemos inserir documentos nele. Todo documento inserido deve ser identificado através do que chamamos de “Document ID”. Cada documento pode ter sua própria estrutura. Não é necessário que os documentos armazenados em um mesmo collection tenham a mesma estrutura.

Inserindo documentos no collection:

<?php
/* includes */
require_once ("Zend/Cloud/DocumentService/Factory.php");
require_once ("Zend/Cloud/DocumentService/Adapter.php");
require_once ("Zend/Config/Ini.php");

/* carregar as configuracoes para o Zend_Cloud  */
$config = new Zend_Config_Ini('cloud.ini');

/* instancia do DocumentService */
$adapter = Zend_Cloud_DocumentService_Factory::getAdapter($config->cloud);

/*
 * ao obter a class do adpter, garantimos que eh uma classe
 * direta ou que extende Zend_Cloud_DocumentService_Document
 */
$class = $adapter->getDocumentClass();

/* chave primaria do registro */
$primaryKey = 'doug123';

/* dados que a serem inseridos no collection */
$doc = new $class(array(
        'nome' => 'Douglas',
        'apelido' => 'Doug',
        'email' => 'douglas.pasqua@gmail.com',
        'idade' => 29,
        'pais' => 'Brasil',
        'idioma' => 'PHP',),
        $primaryKey
);

/* insere os dados em uma collection (tabelas) */
$adapter->insertDocument("usuarios", $doc);

echo "Dados inseridos com sucesso\r\n";

Documentos podem ser obtidos através do ID ou através de “query” no collection.

<?php
/* includes */
require_once ("Zend/Cloud/DocumentService/Factory.php");
require_once ("Zend/Cloud/DocumentService/Adapter.php");
require_once ("Zend/Config/Ini.php");

/* carregar as configuracoes para o Zend_Cloud  */
$config = new Zend_Config_Ini('cloud.ini');

/* instancia do DocumentService */
$adapter = Zend_Cloud_DocumentService_Factory::getAdapter($config->cloud);

/* montando a query */
$query = $adapter->select();
$query->where("email = ?", "douglas.pasqua@gmail.com");

/* fazendo a query no collection */
$r = $adapter->query('usuarios', $query);

/* iterando atraves dos dados obtidos na query */
foreach($r as $reg) {
        echo "Nome: " . $reg->nome . PHP_EOL;
}

Temos vários outros métodos para trabalhar com Documents no Zend Cloud, consulte a documentação para mais exemplos:

http://framework.zend.com/manual/en/zend.cloud.documentservice.html

Queue Service

O Queue Service permite um tipo de computação de dados de forma assíncrona. A implementação permite distribuir mensagens de forma confiável e escalável. Um exemplo de aplicação que utiliza esse serviço seria um “Job Dispatching”. O Frontend dispara o job para o Queue Service de forma assíncrona e temos uma outra aplicação que processa os jobs como se estivesse em background. Esse cenário pode ser útil em várias outras situações. Caso queira habilitar o Queue Serice da Amazon, é necessário habilitar o serviço na sua conta através do link http://aws.amazon.com/sqs/. Para exemplos de utilização no Zend Framework, acesse o link http://framework.zend.com/manual/en/zend.cloud.queueservice.html.

Conclusão

Abordamos aqui os 3 tipos de componentes disponibilizados pelo Zend_Cloud (Storage Service, Document Service e Queue Service). A grande vantagem o Zend_Cloud é que sua estrutura interna faz a abstração das APIs específicas para cada plataforma de computação em nuvem. Portanto caso precise migrar de uma plataforma para outra, será necessário apenas alguns ajustes. Um exemplo, migrar do Amazon para o Microsoft Azure os exemplos deste artigo pode ser feito com poucos ajustes. Amazon e Windows Azure disponibilizam diversos outros serviços de computação em nuvem além desses. Aconselho visitar as referências abaixo para aprender mais.

Referências

http://framework.zend.com/manual/en/zend.cloud.html
http://simplecloud.org/
http://aws.amazon.com/s3/
http://aws.amazon.com/simpledb/
http://aws.amazon.com/sqs/
http://www.microsoft.com/windowsazure/
http://aws.amazon.com/php/

Make a Comment

Deixe uma resposta para pasquati Cancelar resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

2 Respostas to “PHP e Computação em Nuvem com Zend_Cloud”

RSS Feed for Pasqua Tecnologia Comments RSS Feed

Muito interessante! vlw!

Valeu Fernando.

Recentemente publiquei também um artigo mais recente sobre envio de arquivos de backup para o Storage da Amazon:
http://wp.me/pdjRF-11A

Boa sorte!


Where's The Comment Form?

Liked it here?
Why not try sites on the blogroll...

%d blogueiros gostam disto: