1. Open a Window, see the clouds
Azure e PHP
Rafael Dohms photo credit: Denis Grzetic
Friday, September 30, 2011
2. photo credit: Rob Allen
Rafael Dohms
Evangelista PHP, membro ativo da Comunidade
PHP e certificado ZCE. Ele ajudou na fundação de
dois Grupos de Usuários de PHP ao longo do tempo
e hoje compartilha a coordenação do PHPSP.
Desenvolvedor, gamer e apaixonado por código ele
também é host do primeiro podcast de PHP do
Brasil: PHPSPCast.
Atualmente ele trabalha na equipe SWAT do
grupo MIH, uma equipe de experts que fornecem
conhecimento técnico para o grupo além de trabalhar
com P&D buscando novos nichos da internet e
tecnologia. Seu papel como Desenvolvedor
Sênior é codar, treinar e auxiliar outras empresas e
se divertir enquanto faz isso.
Friday, September 30, 2011
3. OLHANDO PELA JANELA
•O que é a nuvem?
• Por que escolher a nuvem?
• Vamos conhecer o Windows Azure com PHP
• Como isso vai afetar meu código?
Friday, September 30, 2011
4. O QUE É A NUVEM?
não é só mais uma palavra no buzzword bingo
Friday, September 30, 2011
5. HOSPEDAGEM COMUM
• Conta compartilhada, VPS
ou máquina local
• Uma máquina, em um local
• Pagamento mensal
Friday, September 30, 2011
6. Própria
HOSPEDAGEM COMUM
• Conta compartilhada, VPS
ou máquina local
• Uma máquina, em um local
• Pagamento mensal
Friday, September 30, 2011
7. COMPUTAÇÃO NA NUVEM
• Menos “apego físico” (virtualização)
• Uma ou mais máquinas ou
“instancias”
• Geograficamente espalhada
• Pagamento por hora/recurso
• “abstração” de recursos
• 3 Sabores: IaaS, PaaS, SaaS
Friday, September 30, 2011
8. Dados
Aplicação
Software
Sistema Operacional
Hardware/Rede
Friday, September 30, 2011
9. Armazenamento Dados Compartilhar
Publicação Aplicação Desenvolvimento
MySQL Software Apache
Configuração Sistema Operacional Upgrades
Resfriamento Hardware/Rede Cabeamento
Friday, September 30, 2011
10. IaaS a Service”
“Infrastructure as
“Infraestrutura como Serviço”
Dados
Aplicação
Software
Sistema Operacional
Hardware/Rede
Friday, September 30, 2011
11. IaaS a Service”
“Infrastructure as
“Infraestrutura como Serviço”
Dados
Aplicação
Software
Sistema Operacional você
eles
Hardware/Rede
Friday, September 30, 2011
12. PaaS
“Platform as a Service”
“Plataforma como Serviço”
Dados
Aplicação você
eles
Software
Sistema Operacional
Hardware/Rede
Friday, September 30, 2011
13. SaaS
“Software as a Service”
“Software como Serviço”
Dados você
eles
Aplicação
Software
Sistema Operacional
Hardware/Rede
Friday, September 30, 2011
14. IaaS Paas SaaS
custos
gerenciamento do
servidor
gerenciamento do
software
publicação da
aplicação
Friday, September 30, 2011
15. X
POR QUE ESCOLHER A NUVEM?
Quais são as vantagens de escolher a nuvem?
Friday, September 30, 2011
16. trafego
tempo
O MODELO CONTA DE LUZ
Friday, September 30, 2011
17. trafego
tempo
O MODELO CONTA DE LUZ
Friday, September 30, 2011
18. trafego
pico
tempo
O MODELO CONTA DE LUZ
Friday, September 30, 2011
19. trafego
pico
tempo
O MODELO CONTA DE LUZ
Friday, September 30, 2011
20. trafego
pico
tempo
O MODELO CONTA DE LUZ
Friday, September 30, 2011
27. Windows Azure
Fabric
Compute Storage
Friday, September 30, 2011
28. Fabric
Middleware, usado para desenvolver, testar, publicar e
gerenciar sua aplicação.
AppFabric
developer
Friday, September 30, 2011
29. Fabric
Compute Storage
Friday, September 30, 2011
30. Compute
Web Role Worker Role VM Role
Máquina virtual de
Aplicação Web
Processamento em Windows Server
rodando sobre o
plano de fundo 2008 carregada
IIS
sob demanda
Friday, September 30, 2011
31. Fabric
Compute Storage
Friday, September 30, 2011
32. Versão cacheada de
CDN qualquer recurso
com uma URI
Storage
Armazenamento de dados
Table Storage Blob Storage SQL Azure Queue
Troca de
Armazenamento Texto e dados Compatível com o
mensagens entre o
estruturado binários SQL Server
Web e o Worker
Friday, September 30, 2011
33. PRONTO PRA RODAR
para Desenvolver e Publicar
• Requisitos:
• IIS7 e ferramentas
• Azure SDK (instala o DevAppFabric, o simulador de
azure)
• Command Line Tools (linha de comando)
• Command line tools for PHP
Friday, September 30, 2011
34. CAIXA DE FERRAMENTAS
• Command Line tools for PHP
• Cria o pacote da aplicação e roda no emulador, simulando o
computacional e o armazenamento.
• Azure Tools para Eclipse
• Torna a maioria dos processos “next, next finish” e fornece
uma IDE completa.
Friday, September 30, 2011
35. Ambiente do Desenvolvedor
Simulador Azure Código
(Dev fabric)
Ferramentas de empacotamento
(linha de comando ou eclipse)
Pacote + Configuração
do Serviço
Azure
Window Azure
(AppFabric)
SQLAzure Storage
Friday, September 30, 2011
36. Ambiente do Desenvolvedor
Simulador Azure Código
(Dev fabric)
PHP
Ferramentas de empacotamento
(linha de comando ou eclipse)
Pacote + Configuração
do Serviço
Azure
Window Azure
(AppFabric)
SQLAzure Storage
Friday, September 30, 2011
37. Ambiente do Desenvolvedor
Simulador Azure Código
(Dev fabric)
PHP
Ferramentas de empacotamento
(linha de comando ou eclipse)
Pacote + Configuração
do Serviço
Azure
Window Azure
(AppFabric)
SQLAzure Storage
Friday, September 30, 2011
38. Ambiente do Desenvolvedor
Simulador Azure Código
(Dev fabric)
PHP php package.php
--project="twitter-azure"
Ferramentas de empacotamento
--target="c:azure-build" de comando ou eclipse)
(linha
--source="C:twitter-azure"
Pacote + Configuração
do Serviço --defaultDoc="public/index.php"
--phpRuntime="C:Program Files (x86)PHPv5.3"
--cleanRebuild
--runDevFabric Azure
Window Azure
(AppFabric)
SQLAzure Storage
Friday, September 30, 2011
39. Ambiente do Desenvolvedor
Simulador Azure Código
(Dev fabric)
PHP
Ferramentas de empacotamento
(linha de comando ou eclipse)
Pacote + Configuração
do Serviço
Azure
Window Azure
(AppFabric)
SQLAzure Storage
Friday, September 30, 2011
40. O BOM
• APIs em REST
• Armazenamento
• Diagnósticos
• BD Relacional: SQL Azure
• Arquitetura por “Roles”
Friday, September 30, 2011
41. O RUIM
• Gerenciamento apenas
pelo Windows
• Sem Emulador Azure
para SO não-Windows
• Sem ferramentas de
empacotamento para
SO não-Windows
Friday, September 30, 2011
42. COMO ISSO AFETA MEU CÓDIGO?
Que ferramentas podemos usar e como devemos desenhar
nossas aplicações?
Friday, September 30, 2011
43. COM O QUE DEVO ME PREOCUPAR?
Friday, September 30, 2011
44. COM O QUE DEVO ME PREOCUPAR?
Código
Friday, September 30, 2011
45. COM O QUE DEVO ME PREOCUPAR?
Código PHP rodando no IIS/Windows
Friday, September 30, 2011
46. COM O QUE DEVO ME PREOCUPAR?
Arquitetura
Código PHP rodando no IIS/Windows
Friday, September 30, 2011
47. COM O QUE DEVO ME PREOCUPAR?
Escalando a
aplicação
Arquitetura
Código PHP rodando no IIS/Windows
Friday, September 30, 2011
48. COM O QUE DEVO ME PREOCUPAR?
Escalando a Sem Armazenamento
aplicação Local
Arquitetura
Código PHP rodando no IIS/Windows
Friday, September 30, 2011
49. COM O QUE DEVO ME PREOCUPAR?
Escalando a Sem Armazenamento Compartilhamento
Local de sessão
aplicação
Arquitetura
Código PHP rodando no IIS/Windows
Friday, September 30, 2011
50. COM O QUE DEVO ME PREOCUPAR?
Escalando a Sem Armazenamento Compartilhamento
Local de sessão
aplicação
Worker Roles
Arquitetura
Código PHP rodando no IIS/Windows
Friday, September 30, 2011
51. COM O QUE DEVO ME PREOCUPAR?
Escalando a Sem Armazenamento Compartilhamento
Local de sessão
aplicação
Worker Roles Filas
Arquitetura
Código PHP rodando no IIS/Windows
Friday, September 30, 2011
52. COM O QUE DEVO ME PREOCUPAR?
Armazenamento
Escalando a Sem Armazenamento Compartilhamento
Local de sessão
aplicação
Worker Roles Filas
Arquitetura
Código PHP rodando no IIS/Windows
Friday, September 30, 2011
53. COM O QUE DEVO ME PREOCUPAR?
Que tipo?
Armazenamento
Escalando a Sem Armazenamento Compartilhamento
Local de sessão
aplicação
Worker Roles Filas
Arquitetura
Código PHP rodando no IIS/Windows
Friday, September 30, 2011
54. COM O QUE DEVO ME PREOCUPAR?
Tabela / Blob
Que tipo?
Armazenamento
Escalando a Sem Armazenamento Compartilhamento
Local de sessão
aplicação
Worker Roles Filas
Arquitetura
Código PHP rodando no IIS/Windows
Friday, September 30, 2011
55. COM O QUE DEVO ME PREOCUPAR?
Tabela / Blob Framework ou PHP SDK
Que tipo?
Armazenamento
Escalando a Sem Armazenamento Compartilhamento
Local de sessão
aplicação
Worker Roles Filas
Arquitetura
Código PHP rodando no IIS/Windows
Friday, September 30, 2011
56. COM O QUE DEVO ME PREOCUPAR?
Tabela / Blob Framework ou PHP SDK
Que tipo?
Banco de
Dados
Armazenamento Relacional
Escalando a Sem Armazenamento Compartilhamento
Local de sessão
aplicação
Worker Roles Filas
Arquitetura
Código PHP rodando no IIS/Windows
Friday, September 30, 2011
57. COM O QUE DEVO ME PREOCUPAR?
Tabela / Blob Framework ou PHP SDK
Que tipo?
Banco de Migrar para SQL Azure
Dados
Armazenamento Relacional
Escalando a Sem Armazenamento Compartilhamento
Local de sessão
aplicação
Worker Roles Filas
Arquitetura
Código PHP rodando no IIS/Windows
Friday, September 30, 2011
59. O QUE FAZ ELE SER
COMPATÍVEL?
Código Roda usando PHP no Windows?
Ferramentas Tem wrappers das APIs?
Banco de Dados É compatível com MS SQL Server?
Friday, September 30, 2011
60. Ferramentas
• Blobs, Tables e Queues
(operações CRUD)
• Classes auxiliares para
transporte HTTP, AuthN/
AuthZ, REST and
Gerenciamento de Erros
• Gerenciamento,
Instrumentação e supporte a
logs
Banco de Dados
• Não testado, mas deve
funcionar.
Friday, September 30, 2011
61. Banco de Dados
• Drivers de MS-SQL* são
compatíveis com
SQLAzure
* Usando pdo_sql_server, possivelmente o pdo_dblib
Powered by Doctrine:
Friday, September 30, 2011
62. • PHP roda normalmente
no Azure, qualquer
framework vai
funcionar.
• Outras ferramentas
para se comunicar com
recursos como: BD, Filas
etc...
• Estes aqui já foram
testados!
Friday, September 30, 2011
64. SAINDO PELA JANELA
Aplicação de teste para ilustrar
• Aplicação de teste: “Twitter RT Calculator”
• Objetivo: Analisar sues últimos tweets, verificar quais foram
re-tuitados e fazer cálculos baseado em palavras e localizações.
• Exemplificar a migração:
• Banco de dados: MySQL > SQLAzure
• Mover o processamento para um Worker Role e usar a Fila
Friday, September 30, 2011
65. SAINDO PELA JANELA
Aplicação de teste para ilustrar
• Aplicação de teste: “Twitter RT Calculator”
• Objetivo: Analisar sues últimos tweets, verificar quais foram
re-tuitados e fazer cálculos baseado em palavras e localizações.
• Exemplificar a migração:
• Banco de dados: MySQL > SQLAzure
• Mover o processamento para um Worker Role e usar a Fila
Friday, September 30, 2011
66. Twitter OAuth
Segura ai..
Friday, September 30, 2011
67. Twitter OAuth
Segura ai..
Friday, September 30, 2011
68. Twitter OAuth
Segura ai..
Friday, September 30, 2011
69. Twitter OAuth
Segura ai..
MySQL
Friday, September 30, 2011
70. Twitter OAuth
Segura ai..
MySQL
Resultados
Friday, September 30, 2011
71. Twitter OAuth
Segura ai..
MySQL
Resultados
Friday, September 30, 2011
72. Twitter OAuth
Segura ai..
MySQL
Resultados
Friday, September 30, 2011
73. Twitter OAuth
Te ligo mais tarde..
Friday, September 30, 2011
74. Twitter OAuth
Queue
Te ligo mais tarde..
Friday, September 30, 2011
75. Twitter OAuth
Queue
Te ligo mais tarde..
Worker
Friday, September 30, 2011
76. Twitter OAuth
Queue
Te ligo mais tarde..
Worker
Friday, September 30, 2011
77. Twitter OAuth
Queue
Te ligo mais tarde..
Worker
Friday, September 30, 2011
78. Twitter OAuth
Queue
Te ligo mais tarde..
Worker
SQLAzure
Friday, September 30, 2011
79. Twitter OAuth
Queue
Te ligo mais tarde..
Worker
SQLAzure
Friday, September 30, 2011
80. Twitter OAuth
Queue
Te ligo mais tarde..
Worker
Resultados
SQLAzure
Friday, September 30, 2011
81. Twitter OAuth
Queue
Te ligo mais tarde..
Worker
Worker
Worker
Worker
Worker
Worker
Worker
Worker
Worker
Worker
Worker
Resultados
SQLAzure
Friday, September 30, 2011
83. TODOS PARA A FILA
//Add user to our Queue
$qItem = new stdClass();
$qItem->twitter_handle = $twitterInfo->screen_name;
$qManager = new AzureQueue($this->getApp()->getConfig('azure'));
$qManager->addToQueue($qItem);
Friday, September 30, 2011
84. TODOS PARA A FILA
//Add user to our Queue
$qItem = new stdClass();
$qItem->twitter_handle = $twitterInfo->screen_name;
$qManager = new AzureQueue($this->getApp()->getConfig('azure'));
$qManager->addToQueue($qItem);
$this->client = new Zend_Service_WindowsAzure_Storage_Queue(
$qConfig['host'], $qConfig['accountName'], $qConfig['accountKey']
);
$this->queue = $this->getQueueInstance($queueName);
__contruct()
Friday, September 30, 2011
85. TODOS PARA A FILA
//Add user to our Queue
$qItem = new stdClass();
$qItem->twitter_handle = $twitterInfo->screen_name;
$qManager = new AzureQueue($this->getApp()->getConfig('azure'));
$qManager->addToQueue($qItem);
$this->client = new Zend_Service_WindowsAzure_Storage_Queue(
$qConfig['host'], $qConfig['accountName'], $qConfig['accountKey']
);
$this->queue = $this->getQueueInstance($queueName);
__contruct()
public function addToQueue($item)
{
$this->client->putMessage($this->queue->name, serialize($item));
}
Friday, September 30, 2011
86. PRIMEIRO QUE
while (true){
try{
ENTRA, PRIMEIRO
$this->logAction("Checking for messages...");
//Read Queue
QUE SAI
$qMessage = $qManager->getMessage();
//If no message, sleep for 3 seconds and try again
if ($qMessage === null){
$this->logAction("No pending messages...");
sleep(3);
continue;
}
//Retrieve User
{... doctrine query for stored twitter handle ...}
//Clear Message
$this->logAction("Removing message form queue...");
$qManager->deleteMessage($qMessage);
//Process User
$this->processUser($user);
//Warn User
$this->sendWarning($user);
} catch (Exception $e) {
$this->logAction("Exception found:" .$e->getMessage
}
$this->logAction("Initiating sleep for next loop.");
sleep(2);
}
Friday, September 30, 2011
87. PRIMEIRO QUE
while (true){
try{
ENTRA, PRIMEIRO
$this->logAction("Checking for messages...");
//Read Queue
QUE SAI
$qMessage = $qManager->getMessage();
//If no message, sleep for 3 seconds and try again
if ($qMessage === null){
$this->logAction("No pending messages...");
sleep(3);
continue;
}
//Retrieve User
{... doctrine query for stored twitter handle ...}
//Clear Message
$this->logAction("Removing message form queue...");
$qManager->deleteMessage($qMessage);
//Process User
$this->processUser($user);
//Warn User
$this->sendWarning($user);
} catch (Exception $e) {
$this->logAction("Exception found:" .$e->getMessage
}
$this->logAction("Initiating sleep for next loop.");
sleep(2);
}
Friday, September 30, 2011
88. PRIMEIRO QUE
while (true){
try{
ENTRA, PRIMEIRO
$this->logAction("Checking for messages...");
//Read Queue
QUE SAI
$qMessage = $qManager->getMessage();
//If no message, sleep for 3 seconds and try again
if ($qMessage === null){
$this->logAction("No pending messages...");
sleep(3);
continue; function getMessage()
public
} {
$messages = $this->client->getMessages($this->queue->name, 1);
//Retrieve User
{... doctrine query for stored twitter handle ...}
if (count($messages) > 0){
$qMessage = array_shift($messages);
//Clear Message
$this->logAction("Removing= message form queue...");
$message new stdClass();
$qManager->deleteMessage($qMessage); = $qMessage;
$message->qMessage
$message->decoded = unserialize($qMessage->messagetext);
//Process User
$this->processUser($user);
return $message;
}
//Warn User
$this->sendWarning($user);
return null;
} catch (Exception $e) {
}
$this->logAction("Exception found:" .$e->getMessage
}
$this->logAction("Initiating sleep for next loop.");
sleep(2);
}
Friday, September 30, 2011
89. PRIMEIRO QUE
while (true){
try{
ENTRA, PRIMEIRO
$this->logAction("Checking for messages...");
//Read Queue
QUE SAI
$qMessage = $qManager->getMessage();
//If no message, sleep for 3 seconds and try again
if ($qMessage === null){
$this->logAction("No pending messages...");
sleep(3);
continue; function getMessage()
public
} {
$messages = $this->client->getMessages($this->queue->name, 1);
//Retrieve User
{... doctrine query for stored twitter handle ...}
if (count($messages) > 0){
$qMessage = array_shift($messages);
//Clear Message
$this->logAction("Removing= message form queue...");
$message new stdClass();
$qManager->deleteMessage($qMessage); = $qMessage;
$message->qMessage
$message->decoded = unserialize($qMessage->messagetext);
//Process User
$this->processUser($user);
return $message;
}
//Warn User
$this->sendWarning($user); array(
return null; 'messageid' => $messageId,
'insertiontime' => $insertionTime,
} catch (Exception $e) {
} 'expirationtime' => $expirationTime,
$this->logAction("Exception found:" .$e->getMessage
'popreceipt' => $popReceipt,
'timenextvisible' => $timeNextVisible,
}
'dequeuecount' => $dequeueCount,
'messagetext' => $messageText
$this->logAction("Initiating sleep for next loop.");
);
sleep(2);
}
Friday, September 30, 2011
90. PRIMEIRO QUE
while (true){
try{
ENTRA, PRIMEIRO
$this->logAction("Checking for messages...");
//Read Queue
QUE SAI
$qMessage = $qManager->getMessage();
//If no message, sleep for 3 seconds and try again
if ($qMessage === null){
$this->logAction("No pending messages...");
sleep(3);
continue;
}
//Retrieve User
{... doctrine query for stored twitter handle ...}
//Clear Message
$this->logAction("Removing message form queue...");
$qManager->deleteMessage($qMessage);
//Process User
$this->processUser($user);
//Warn User
$this->sendWarning($user);
} catch (Exception $e) {
$this->logAction("Exception found:" .$e->getMessage
}
$this->logAction("Initiating sleep for next loop.");
sleep(2);
}
Friday, September 30, 2011
91. PRIMEIRO QUE
while (true){
try{
ENTRA, PRIMEIRO
$this->logAction("Checking for messages...");
//Read Queue
QUE SAI
$qMessage = $qManager->getMessage();
//If no message, sleep for 3 seconds and try again
if ($qMessage === null){
$this->logAction("No pending messages...");
sleep(3);
continue;
}
//Retrieve User
{... doctrine query for stored twitter handle ...}
//Clear Message
$this->logAction("Removing message form queue...");
$qManager->deleteMessage($qMessage); Após 20 segundos, a mensagem
//Process User volta para a fila
$this->processUser($user);
//Warn User
$this->sendWarning($user);
} catch (Exception $e) {
$this->logAction("Exception found:" .$e->getMessage
}
$this->logAction("Initiating sleep for next loop.");
sleep(2);
}
Friday, September 30, 2011
92. SAINDO PELA JANELA
• Veja todas mudanças: github.com/rdohms/Sample-Azure-
App
• Compare estes branches:
non-cloud-version x cloud-designed-version
Friday, September 30, 2011
93. FECHANDO A JANELA
• Descobrimos o que é a nuvem
• Vimos razões por que escolher a nuvem
• Conhecemos o Windows Azure e seus recursos
• Olhamos rapidamente em como isso afeta nosso código
Friday, September 30, 2011
94. LEITURA COMPLEMENTAR...
PHP Development in the
Cloud
ISBN: 9780981034522
Pages: 172
Authors: Ivo Jansch and Vito Chin
http://bit.ly/i9Awk0
Friday, September 30, 2011
95. COMECE A BRINCAR..
• Conta de teste gratuita: WindowsAzurePass.com
http://azurephp.com
http://phpazure.codeplex.com/
http://azurephptools.codeplex.com/
http://www.ben-waine.co.uk/blog/php-azure
http://marvelley.com/category/php/php-on-azure/
Friday, September 30, 2011