SlideShare uma empresa Scribd logo
1 de 42
Baixar para ler offline
12 fatores
em projetos PHP
Elton Minetto
http://eltonminetto.net
@eminetto
Criado pela equipe da Heroku é uma espécie de
“manifesto” com os 12 fatores que uma aplicação
deveria seguir para ser "cloud native".
I.Codebase
Uma única base de código, múltiplos deploys,
gerenciado por controle de versões
→ Github
→ Gitlab
→ Bitbucket
II.Dependencies
Todas as dependências do projeto devem estar
declaradas no próprio projeto.
→ Composer
→ Infrastructure as Code (Docker, Puppet, Chef,
Ansible, Terraform, etc)
III.Config
Configurações armazenadas fora do código.
Variáveis de ambiente
<?php
public static function build()
{
$bernardSerializer = new BernardSerializer(new FQCNMessageFactory(), new NoOpMessageConverter());
switch (getenv('QUEUE_DRIVER')) {
case 'sqs':
$connection = SqsClient::factory([
'key' => getenv('QUEUE_SQS_KEY'),
'secret' => getenv('QUEUE_SQS_SECRET'),
'region' => getenv('QUEUE_SQS_REGION')
]);
$driver = new SqsDriver($connection);
break;
case 'flatfile':
$driver = new FlatFileDriver(getenv('QUEUE_FLATFILE_PATH'));
break;
}
$queue = new PersistentFactory($driver, $bernardSerializer);
return $queue;
}
Arquivos distintos para ambientes distintos
ls -l config/
-rw-r--r-- 1 eminetto staff 646 Nov 27 11:51 local.php
-rw-r--r-- 1 eminetto staff 1237 Oct 2 09:06 staging.php
-rw-r--r-- 1 eminetto staff 357 Jul 31 11:21 testing.php
-rw-r--r-- 1 eminetto staff 549 Oct 2 09:06 production.php
IV.Backing Services
Serviços externos que o aplicativo consome.
Banco de dados, cache, podem estar tanto locais
quanto remotos sem mudanças de código
→ Doctrine
→ Bernard
→ Zend Cache, Doctrine Cache, etc
V.Build, release, run
Três fases bem separadas e definidas facilita a
criação de scripts e procedimentos a serem
executados em cada uma delas.
→ Makefiles
→ Shell script
→ Deployer
VI.Processes
O aplicativo como um ou mais processos, que sejam
“stateless” e “share-nothing”
Diminuir o acoplamento entre componentes do
projeto para facilitar a escala
→ JWT
→ Filas, cache, S3, etc.
VII.Port binding
Não depender de um servidor externo para ser
executado, poder ser auto-contido e executar em
uma porta específica que seria acessado por outras
partes do projeto.
Depender de uma estrutura de nomes e endereços
que podem ser configurados em arquivos de
configuração
<?php
namespace ApplicationService;
use PsrContainerContainerInterface;
class InstallFactory
{
public function __invoke(ContainerInterface $container)
{
$entityManager = $container->get('EntityManager');
$cache = $container->get('Cache');
$config = $container->get('config');
$tokenService = $container->get('TokenService');
$providerService = $container->get('ProviderService');
return new Install($entityManager, $cache, $config, $tokenService, $providerService);
}
}
VIII. Concurrency
Pensar o projeto como processos que podem ser
executados em paralelo.
→ RabbitMQ, Gearman, SQS (Bernard ajuda a deixar
transparente)
IX. Disposability
Processos facilmente descartáveis, que podem ser
iniciados ou parados a qualquer momento.
Facilitar este processo, permitindo início rápido,
processo de finalização simplificado
X. Dev/prod parity
Ambientes de desenvolvimento, homologação e
produção devem ser iguais
→ Vagrant
→ Docker
→ Puppet, Chef, Ansible, Terraform
XI. Logs
O código não deve se preocupar com o formato de
armazenamento. Pode enviar as mensagens para a
saída padrão e esta deve ser redirecionada para
locais específicos de acordo com o ambiente onde o
projeto está executando. Ou usar ferramentas
específicas.
→ Monolog
→ Zend Log
→ Sentry
XII. Admin processes
Tarefas administrativas como limpar caches, carregar
dados, atualizar bases de dados, devem ser tratadas
de forma automatizada
→ Migrations (Laravel, Doctrine, etc)
→ Fixtures (Laravel, Doctrine, etc)
→ Makefiles
→ Shell Script
Resumindo
I.Codebase
II.Dependencies
III.Config
IV.Backing Services
V.Build, release, run
VI.Processes
VII.Port binding
VIII. Concurrency
IX. Disposability
X. Dev/prod parity
XI. Logs
XII. Admin processes
Perguntas
Contato
http://eltonminetto.net
http://coderockr.com
http://codenation.com.br
http://asemanaphp.com.br

Mais conteúdo relacionado

Semelhante a 12 factor in the PHP world

Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Elton Minetto
 
Curso de Introdução - PHP Zend Framework
Curso de Introdução - PHP Zend FrameworkCurso de Introdução - PHP Zend Framework
Curso de Introdução - PHP Zend FrameworkEvandro Klimpel Balmant
 
Containers com docker #CPRecife4
Containers com docker #CPRecife4Containers com docker #CPRecife4
Containers com docker #CPRecife4David Ruiz
 
The twelve factor apps and openruko
The twelve factor apps and openrukoThe twelve factor apps and openruko
The twelve factor apps and openrukoÉverton Ribeiro
 
Integração Contínua com Cruise Control e phpUnderControl
Integração Contínua com Cruise Control e phpUnderControlIntegração Contínua com Cruise Control e phpUnderControl
Integração Contínua com Cruise Control e phpUnderControlDiego Tremper
 
Desenvolvendo para WordPress com Docker, Git e WP-CLI
Desenvolvendo para WordPress com Docker, Git e WP-CLIDesenvolvendo para WordPress com Docker, Git e WP-CLI
Desenvolvendo para WordPress com Docker, Git e WP-CLIRudá Almeida
 
Ha proxy + consul = balance de carga transparente para conteiners
Ha proxy + consul = balance de carga transparente para conteinersHa proxy + consul = balance de carga transparente para conteiners
Ha proxy + consul = balance de carga transparente para conteinersguitoper
 
Symfony Live - São Paulo 2019 - Como construir uma API em um passo com API Pl...
Symfony Live - São Paulo 2019 - Como construir uma API em um passo com API Pl...Symfony Live - São Paulo 2019 - Como construir uma API em um passo com API Pl...
Symfony Live - São Paulo 2019 - Como construir uma API em um passo com API Pl...BrunoSouza617
 
Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.Vinícius de Paula
 
Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?Felipe Mamud
 
Re pensando-virtualização-através-linux containers
Re pensando-virtualização-através-linux containersRe pensando-virtualização-através-linux containers
Re pensando-virtualização-através-linux containersFrancisco Gonçalves
 
O que esperar do Zend Framework 3
O que esperar do Zend Framework 3O que esperar do Zend Framework 3
O que esperar do Zend Framework 3Flávio Lisboa
 
Minicurso de Cakephp
Minicurso de CakephpMinicurso de Cakephp
Minicurso de CakephpCauan Cabral
 
Curso de Verão - Aula 02 - Orquestração de Contêineres
Curso de Verão - Aula 02 - Orquestração de ContêineresCurso de Verão - Aula 02 - Orquestração de Contêineres
Curso de Verão - Aula 02 - Orquestração de ContêineresGuilhermeJorgeAragod
 
Desenvolvendo e implantando aplicações PHP utilizando Docker
Desenvolvendo e implantando aplicações PHP utilizando DockerDesenvolvendo e implantando aplicações PHP utilizando Docker
Desenvolvendo e implantando aplicações PHP utilizando DockerBruno Ricardo Siqueira
 
Supervisão e Monitorização
Supervisão e MonitorizaçãoSupervisão e Monitorização
Supervisão e MonitorizaçãoSAPO Sessions
 
CEPUG 2 - Bem-vindo a Framework CodeIgniter
CEPUG 2 - Bem-vindo a Framework CodeIgniterCEPUG 2 - Bem-vindo a Framework CodeIgniter
CEPUG 2 - Bem-vindo a Framework CodeIgniterEric Silva
 
Alta Performance de Aplicações PHP com Nginx
Alta Performance de Aplicações PHP com NginxAlta Performance de Aplicações PHP com Nginx
Alta Performance de Aplicações PHP com NginxThiago Paes
 

Semelhante a 12 factor in the PHP world (20)

Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2
 
Curso de Introdução - PHP Zend Framework
Curso de Introdução - PHP Zend FrameworkCurso de Introdução - PHP Zend Framework
Curso de Introdução - PHP Zend Framework
 
PHP e Redis
PHP e RedisPHP e Redis
PHP e Redis
 
Containers com docker #CPRecife4
Containers com docker #CPRecife4Containers com docker #CPRecife4
Containers com docker #CPRecife4
 
The twelve factor apps and openruko
The twelve factor apps and openrukoThe twelve factor apps and openruko
The twelve factor apps and openruko
 
Integração Contínua com Cruise Control e phpUnderControl
Integração Contínua com Cruise Control e phpUnderControlIntegração Contínua com Cruise Control e phpUnderControl
Integração Contínua com Cruise Control e phpUnderControl
 
Desenvolvendo para WordPress com Docker, Git e WP-CLI
Desenvolvendo para WordPress com Docker, Git e WP-CLIDesenvolvendo para WordPress com Docker, Git e WP-CLI
Desenvolvendo para WordPress com Docker, Git e WP-CLI
 
Ha proxy + consul = balance de carga transparente para conteiners
Ha proxy + consul = balance de carga transparente para conteinersHa proxy + consul = balance de carga transparente para conteiners
Ha proxy + consul = balance de carga transparente para conteiners
 
Symfony Live - São Paulo 2019 - Como construir uma API em um passo com API Pl...
Symfony Live - São Paulo 2019 - Como construir uma API em um passo com API Pl...Symfony Live - São Paulo 2019 - Como construir uma API em um passo com API Pl...
Symfony Live - São Paulo 2019 - Como construir uma API em um passo com API Pl...
 
Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.
 
Caelum Day In Rio
Caelum Day In RioCaelum Day In Rio
Caelum Day In Rio
 
Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?
 
Re pensando-virtualização-através-linux containers
Re pensando-virtualização-através-linux containersRe pensando-virtualização-através-linux containers
Re pensando-virtualização-através-linux containers
 
O que esperar do Zend Framework 3
O que esperar do Zend Framework 3O que esperar do Zend Framework 3
O que esperar do Zend Framework 3
 
Minicurso de Cakephp
Minicurso de CakephpMinicurso de Cakephp
Minicurso de Cakephp
 
Curso de Verão - Aula 02 - Orquestração de Contêineres
Curso de Verão - Aula 02 - Orquestração de ContêineresCurso de Verão - Aula 02 - Orquestração de Contêineres
Curso de Verão - Aula 02 - Orquestração de Contêineres
 
Desenvolvendo e implantando aplicações PHP utilizando Docker
Desenvolvendo e implantando aplicações PHP utilizando DockerDesenvolvendo e implantando aplicações PHP utilizando Docker
Desenvolvendo e implantando aplicações PHP utilizando Docker
 
Supervisão e Monitorização
Supervisão e MonitorizaçãoSupervisão e Monitorização
Supervisão e Monitorização
 
CEPUG 2 - Bem-vindo a Framework CodeIgniter
CEPUG 2 - Bem-vindo a Framework CodeIgniterCEPUG 2 - Bem-vindo a Framework CodeIgniter
CEPUG 2 - Bem-vindo a Framework CodeIgniter
 
Alta Performance de Aplicações PHP com Nginx
Alta Performance de Aplicações PHP com NginxAlta Performance de Aplicações PHP com Nginx
Alta Performance de Aplicações PHP com Nginx
 

Mais de Elton Minetto

Go e Microserviços - Nascidos um para o outro
Go e Microserviços - Nascidos um para o outroGo e Microserviços - Nascidos um para o outro
Go e Microserviços - Nascidos um para o outroElton Minetto
 
Object Calisthenics em Go
Object Calisthenics em GoObject Calisthenics em Go
Object Calisthenics em GoElton Minetto
 
Programar != desenvolver software (v2)
Programar != desenvolver software (v2)Programar != desenvolver software (v2)
Programar != desenvolver software (v2)Elton Minetto
 
Gerenciando uma startup no Github Projects
Gerenciando uma startup no Github ProjectsGerenciando uma startup no Github Projects
Gerenciando uma startup no Github ProjectsElton Minetto
 
Clean architecture em Go - v2
Clean architecture em Go - v2Clean architecture em Go - v2
Clean architecture em Go - v2Elton Minetto
 
Programar != desenvolver software
Programar != desenvolver softwareProgramar != desenvolver software
Programar != desenvolver softwareElton Minetto
 
Clean Architecture in Golang
Clean Architecture in GolangClean Architecture in Golang
Clean Architecture in GolangElton Minetto
 
A jornada do desenvolvedor
A jornada do desenvolvedorA jornada do desenvolvedor
A jornada do desenvolvedorElton Minetto
 
Product and Technology
Product and TechnologyProduct and Technology
Product and TechnologyElton Minetto
 
Code:Nation Tech Stack
Code:Nation Tech StackCode:Nation Tech Stack
Code:Nation Tech StackElton Minetto
 
Building APIs using Go
Building APIs using GoBuilding APIs using Go
Building APIs using GoElton Minetto
 
O case da Compufácil e AWS
O case da Compufácil e AWSO case da Compufácil e AWS
O case da Compufácil e AWSElton Minetto
 
Como extrair métricas do Trello
Como extrair métricas do TrelloComo extrair métricas do Trello
Como extrair métricas do TrelloElton Minetto
 
Memórias das trincheiras (parte 2)
Memórias das trincheiras (parte 2)Memórias das trincheiras (parte 2)
Memórias das trincheiras (parte 2)Elton Minetto
 
Metodologias ágeis interativas
Metodologias ágeis interativasMetodologias ágeis interativas
Metodologias ágeis interativasElton Minetto
 

Mais de Elton Minetto (20)

Go e Microserviços - Nascidos um para o outro
Go e Microserviços - Nascidos um para o outroGo e Microserviços - Nascidos um para o outro
Go e Microserviços - Nascidos um para o outro
 
Object Calisthenics em Go
Object Calisthenics em GoObject Calisthenics em Go
Object Calisthenics em Go
 
Programar != desenvolver software (v2)
Programar != desenvolver software (v2)Programar != desenvolver software (v2)
Programar != desenvolver software (v2)
 
Gerenciando uma startup no Github Projects
Gerenciando uma startup no Github ProjectsGerenciando uma startup no Github Projects
Gerenciando uma startup no Github Projects
 
Clean Architecture
Clean ArchitectureClean Architecture
Clean Architecture
 
Serverless em Go
Serverless em GoServerless em Go
Serverless em Go
 
JAMstack
JAMstackJAMstack
JAMstack
 
Clean architecture em Go - v2
Clean architecture em Go - v2Clean architecture em Go - v2
Clean architecture em Go - v2
 
Programar != desenvolver software
Programar != desenvolver softwareProgramar != desenvolver software
Programar != desenvolver software
 
Clean Architecture in Golang
Clean Architecture in GolangClean Architecture in Golang
Clean Architecture in Golang
 
A jornada do desenvolvedor
A jornada do desenvolvedorA jornada do desenvolvedor
A jornada do desenvolvedor
 
Product and Technology
Product and TechnologyProduct and Technology
Product and Technology
 
Code:Nation Tech Stack
Code:Nation Tech StackCode:Nation Tech Stack
Code:Nation Tech Stack
 
Building APIs using Go
Building APIs using GoBuilding APIs using Go
Building APIs using Go
 
Start you
Start youStart you
Start you
 
O case da Compufácil e AWS
O case da Compufácil e AWSO case da Compufácil e AWS
O case da Compufácil e AWS
 
Introdução a Go
Introdução a GoIntrodução a Go
Introdução a Go
 
Como extrair métricas do Trello
Como extrair métricas do TrelloComo extrair métricas do Trello
Como extrair métricas do Trello
 
Memórias das trincheiras (parte 2)
Memórias das trincheiras (parte 2)Memórias das trincheiras (parte 2)
Memórias das trincheiras (parte 2)
 
Metodologias ágeis interativas
Metodologias ágeis interativasMetodologias ágeis interativas
Metodologias ágeis interativas
 

12 factor in the PHP world