Back-End

23 mar, 2017

Trabalhando com AppEngine Flexible Environment e PHP

Publicidade

Salve, pessoal. Sabem o projeto que fizemos no ultimo artigo? Que tal subirmos no Google Cloud? E mais: no Flexible Environment, evolução do Google AppEngine que já conhecíamos e que usa Docker nos bastidores.

Configurando o Google Cloud

Antes de continuarmos, você deve ter uma conta Google e acessar https://console.cloud.google.com e criar um novo projeto.

Agora, vamos baixar o sdk, conforme as orientações deste link, para seu sistema operacional. Como indicado lá, após iniciar uma nova sessão do seu shell (isso inclui o prompt de comando do windows) você deve inicializar o sdk autenticando-se com sua conta Google. Em determinado ponto dessa inicialização, será solicitado que você selecione um projeto – o que criamos no passo anterior.

Configurando o projeto

Vamos voltar ao código que fizemos no artigo anterior e configurá-lo no AppEngine. Vamos criar um arquivo app.yaml; nele coloque o seguinte:

runtime: php
env: flex

runtime_config:
  document_root: public

Na linha 1, estamos configurando o runtime, como PHP. Na segunda linha, o ambiente que configuramos como flex. Em runtime_config, estendemos a configuração inicial e alteramos o document_root para public. Como vocês devem lembrar, utilizamos o pds/skeleton como base e o mesmo dita que, em outras palavras, devemos mapear o document root para o publice foi exatamente o que fizemos.

Deploy

gcloud beta app deploy

Como o PHP ainda é um beta no AppEngine, quando falamos de Flexible Environment, o sdk irá baixar mais alguns arquivos que disponibilizarão os comandos nesse ambiente, que ficarão agrupados sob gcloud beta. Durante o processo, o programa perguntará em qual região você deseja fazer o deploy, caso não tenha configurado uma padrão para o projeto – ele já informa em quais regiões o Flexible está habilitado. Se tiver mais de um projeto no Google Cloud, será necessária a seleção do projeto.

Na sequência começa o deploy em si começa e você pode acompanhar as tarefas que o AppEngine realiza, como configurar o ambiente para 5.6, 7.0 ou 7.1 conforme o que você declara no composer.json, preparar e desligar containers… Ao final, você pode ver o endereço da aplicação no ar, que normalmente segue o padrão https://<nome_do_projeto>.appspot.com.

Pronto! Projeto no Google App Engine já está rodando no Flexible Environment.

“Pera, é só isso? O artigo acabou?” Sim, é só isso. O artigo acabou? Calma…

Como vocês puderam conferir, subimos a aplicação que havíamos feito, que contempla somente uma rota em /. O que acontece se tivermos mais uma rota? Temos que fazer toda aquela configuração no servidor web para aceitar parâmetros? Vamos incrementar um pouco nosso projeto.

Criando uma nova rota

Antes de continuar, vamos renomear a classe PeopleProvider para DataProvider, por uma questão de semântica. Lembrando que o nome do arquivo precisa ser alterado também. Aí, a Classe fica assim:

<?php
namespace Duodraco\Service;
use Duodraco\Foundation\Command\Service;
class DataProvider extends Service
{
    public function peopleToFollow(): array
    {
        return [
            "@gabidavila" => "Gabriela D'Ávila",
            "@eminetto" => "Elton Minetto",
            "@abdala" => "Abdala Cerqueira",
            "@dianaarnos" => "Diana Arnos"
        ];
    }
    public function getPHPVersion(): string
    {
        return PHP_MAJOR_VERSION.'.'.PHP_MINOR_VERSION;
    }
}

Em seguida, já adicionamos o novo método que será usado pela nova rota; para outro teste que faremos adiante, este método retorna simplesmente a versão corrente do PHP. Agora, vamos alterar o resources/routes/main.yml. Obviamente, temos que alterar o mapeamento para o (People)DataProvider da rota index, pelo que fizemos no passo anterior. Também vamos criar a nova rota.

index:
  path: '/'
  defaults:
    _controller: 'Duodraco\Command\Main::go'
    service: 'Duodraco\Service\DataProvider'
  requirements: { }
  methods: [GET]

phpversion:
  path: '/phpversion'
  defaults:
    _controller: 'Duodraco\Command\Version::go'
    service: 'Duodraco\Service\DataProvider'
  requirements: { }
  methods: [GET]

Por fim, vamos criar o Command da nova rota em src/Duodraco/Command/Version.php:

<?php
namespace Duodraco\Command;
use Duodraco\Foundation\Command\Command;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class Version extends Command
{
    public function execute(Request $request, array $attributes): Response
    {
        $response = $this->service->getPHPVersion();
        return new Response($response);
    }
}

Para testar localmente, vale realizar o composer update -o para atualizar o mapeamento do autoloader. Aí, se você testar com o Servidor Embutido (também conhecido como php -S ), tudo já vai funcionar.

Agora vamos refazer o deploy (gcloud beta app deploy). Você notará que será um pouco mais rápido dessa vez. Quando terminar, acesse https://<nome_do_projeto>.appspot.com/phpversion e você provavelmente receberá um 7.1.

Chegamos a um ponto interessante: aprendemos o deploy no GAE (Google App Engine) Flex(ible Environment) e, de quebra, a adicionamos rotas no nosso projeto. Nos próximos artigos vamos evoluir nosso projeto.

Vamos a mais um teste! Altere o composer.json do projeto e na seção require, edite o requisito para a versão do PHP, podendo ser assim “php”:”7.0.*”. Realize novamente o deploy e cheque o /phpversion na instância. Agora, você receberá um 7.0. Sim, você pode alterar a versão do PHP sendo executado simplesmente por alterar o composer.json do projeto. Pense nisso nas migrações que terá que fazer de 5.6 para 7, de 7.0 para 7.1…

Vocês usaram alguma linha de comando Docker ao longo desse artigo? Nenhum, não é mesmo? Os comandos de deploy do gcloud abstraem toda a complexidade por nós. Há muito mais para aprender e um bom começo é por aqui: https://cloud.google.com/appengine/docs/flexible/php/how-to.

Alteramos o projeto e o evoluímos mais um pouco. Notem que é bem simples de alterarmos e criarmos rotas para nossa aplicação. A classe que recebe a requisição (Version) é responsável única e exclusivamente por isso.

Vamos mais a fundo tanto no GAE, como no projeto PHP ao longo dos próximos artigos.

Deixe seus comentários e recomende o artigo se gostou.

Até o próximo!