Como gerenciar sessões com o Firestore

Veja neste tutorial como gerenciar sessões no App Engine.

Muitos aplicativos precisam gerenciar sessões de autenticação e preferências do usuário. O PHP tem uma implementação baseada em memória para executar essa função. No entanto, essa implementação não é adequada para um aplicativo que pode ser veiculado de várias instâncias, porque a sessão gravada em uma instância pode ser diferente nas outras.

Objetivos

  • Gravar o aplicativo.
  • Executar o aplicativo localmente.
  • Implantar o aplicativo no App Engine.

Custos

Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custo baseada na sua projeção de uso, use a calculadora de preços.

Novos usuários do Google Cloud podem estar qualificados para um teste sem custo financeiro.

Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Para mais informações, consulte Limpeza.

Antes de começar

  1. Faça login na sua conta do Google Cloud . Se você começou a usar o Google Cloudagora, crie uma conta para avaliar o desempenho dos nossos produtos em situações reais. Clientes novos também recebem US $300 em créditos para executar, testar e implantar cargas de trabalho.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Firestore API, if it is not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the API

  5. Install the Google Cloud CLI.

  6. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  7. To initialize the gcloud CLI, run the following command:

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. Enable the Firestore API, if it is not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the API

  11. Install the Google Cloud CLI.

  12. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  13. To initialize the gcloud CLI, run the following command:

    gcloud init
  14. Configure a CLI gcloud para usar seu novo projeto Google Cloud :
    # Configure gcloud for your project
    gcloud config set project PROJECT_ID
    Substitua PROJECT_ID pelo ID do projeto do Google Cloud que você criou ou selecionou anteriormente.

Como configurar o projeto

  1. Na janela do terminal, comece em um diretório de sua escolha e crie um novo diretório chamado sessions. Todo o código deste tutorial está dentro do diretório sessions.

  2. Mude para o diretório sessions:

    cd sessions
    
  3. Instale as dependências:

    composer require google/cloud-firestore
    

No final deste tutorial, a estrutura final do arquivo é semelhante à seguinte:

sessions
├── app.yaml
└── composer.json
├── index.php

Como gravar o aplicativo

  • Na janela do terminal, crie um arquivo chamado index.php com o seguinte conteúdo:

    <?php
    /*
     * Copyright 2019 Google LLC
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *   http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    
    require_once __DIR__ . '/vendor/autoload.php';
    
    use Google\Cloud\Firestore\FirestoreClient;
    
    $projectId = getenv('GOOGLE_CLOUD_PROJECT');
    // Instantiate the Firestore Client for your project ID.
    $firestore = new FirestoreClient([
        'projectId' => $projectId,
    ]);
    
    $handler = $firestore->sessionHandler(['gcLimit' => 500]);
    
    // Configure PHP to use the the Firebase session handler.
    session_set_save_handler($handler, true);
    session_save_path('sessions');
    session_start();
    
    $colors = ['red', 'blue', 'green', 'yellow', 'pink'];
    /**
     * This is an example of a front controller for a flat file PHP site. Using a
     * Static list provides security against URL injection by default.
     */
    switch (@parse_url($_SERVER['REQUEST_URI'])['path']) {
        case '/':
            if (!isset($_SESSION['views'])) {
                $_SESSION['views'] = 0;
                $_SESSION['color'] = $colors[rand(0, 4)];
            }
            printf(
                '<body bgcolor="%s">Views: %s</body>',
                $_SESSION['color'],
                $_SESSION['views']++
            );
            break;
        default:
            http_response_code(404);
            exit('Not Found');
    }
    

Esse aplicativo exibe saudações em idiomas diferentes para cada usuário. Usuários recorrentes são sempre recebidos no mesmo idioma.

Várias janelas de aplicativos exibindo uma saudação em idiomas diferentes.

Para que o app possa armazenar as preferências de um usuário, você precisa de uma maneira de armazenar informações sobre o usuário atual em uma sessão. Este app de amostra usa o Firestore para armazenar esses dados.

Você pode usar o Firestore session handler para usar o Firestore em sessões do PHP.

Veja no diagrama a seguir como o Firestore gerencia as sessões do aplicativo do App Engine.

Diagrama da arquitetura: usuário, App Engine, Firestore.

Depois que você definir session_set_save_handler, cada solicitação terá uma variável global $_SESSION que pode ser usada para acessar a sessão. Os dados da sessão são armazenados no Firestore.

Como executar no local

  1. Inicie o servidor da Web PHP integrado:

    php -S localhost:8080
    
  2. Veja seu app no navegador da Web:

    Cloud Shell

    Na barra de ferramentas do Cloud Shell, clique em Visualização da Web Visualização da Web e selecione Visualizar na porta 8080.

    Máquina local

    No seu navegador, acesse http://localhost:8080

    Você verá uma das cinco saudações: "Hello World"," "Hallo Welt", "Hola mundo", "Salut le Monde" ou "Ciao Mondo". O idioma será alterado se você abrir a página em um navegador diferente ou no modo de navegação anônima. É possível conferir e editar os dados da sessão no consoleGoogle Cloud .

    Sessões do Firestore no console Google Cloud .

  3. Para interromper o servidor HTTP, pressione Control+C na janela do terminal.

Como implantar e executar no App Engine

Use o ambiente padrão do App Engine para criar e implantar um app que seja executado de maneira confiável sob grande carga e com grandes quantidades de dados.

Neste tutorial, o ambiente padrão do App Engine é usado para implantar o servidor.

  1. Na janela do terminal, crie um arquivo app.yaml e copie o seguinte:

    runtime: php73
    
  2. Implante o aplicativo no App Engine:

    gcloud app deploy
    
  3. Para visualizar o aplicativo ativo, insira o seguinte URL:

    https://PROJECT_ID.REGION_ID.r.appspot.com

    Substitua:

A saudação agora é entregue por um servidor da Web executado em uma instância do App Engine.

Como excluir sessões

O PHP executa a sessão coleta de lixo (GC, na sigla em inglês) (link em inglês), que remove sessões antigas e expiradas de acordo com a configuração php.ini. O gerenciador de sessão do Firestore não limpa sessões por padrão, mas você pode configurá-lo para fazer isso ao transmitir uma opção gcLimit durante a criação do gerenciador de sessão:

$handler = $firestore->sessionHandler(['gcLimit' => 500]);

As sessões são removidas usando a GC com base em probabilidade ou quando você chama a função session_gc explicitamente.

Como depurar o aplicativo

Se você não conseguir se conectar ao aplicativo do App Engine, verifique o seguinte:

  1. Verifique se os comandos de implantação gcloud foram concluídos com êxito e não geraram erros. Se houver erros (por exemplo, message=Build failed), corrija-os e tente implantar o aplicativo do App Engine novamente.
  2. No console do Google Cloud , acesse a página Análise de registros.

    Acessar a página Análise de registros

    1. Na lista suspensa Recursos selecionados recentemente, clique em Aplicativo App Engine e, em seguida, clique em Todos os module_id. Você verá uma lista de solicitações de quando visitou seu aplicativo. Caso contrário, verifique se você selecionou Todos os module_id na lista suspensa. Se você encontrar mensagens de erro no console do Google Cloud , verifique se o código do app corresponde ao código na seção sobre como escrever o app da Web.

    2. Verifique se a API Firestore está ativada.

Limpar

Excluir o projeto

  1. No console Google Cloud , acesse a página Gerenciar recursos.

    Acessar "Gerenciar recursos"

  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.

Excluir a instância do App Engine

  1. No console Google Cloud , acesse a página Versões do App Engine.

    Acessar "Versões"

  2. Marque a caixa de seleção da versão não padrão do app que você quer excluir.
  3. Para excluir a versão do app, clique em Excluir.

A seguir