Controla sesiones con Firestore

En este instructivo se muestra cómo controlar sesiones en App Engine.

En muchas aplicaciones, se necesita manejar sesiones para la autenticación y las preferencias del usuario. En PHP, se incluye una implementación basada en la memoria para realizar esta función. Sin embargo, esta implementación no es adecuada para una aplicación que se puede entregar desde varias instancias, ya que la sesión que se registra en una instancia puede diferir de otras.

Objetivos

  • Escribe la aplicación.
  • Ejecuta la aplicación de manera local.
  • Implementa la aplicación en App Engine.

Costos

En este instructivo, se usan los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud sean aptos para obtener una prueba gratuita.

Cuando finalices este instructivo, podrás borrar los recursos creados para evitar que se te siga facturando. Para obtener más información, consulta cómo hacer una limpieza.

Antes de comenzar

  1. Accede a tu Cuenta de Google.

    Si todavía no tienes una cuenta, regístrate para obtener una nueva.

  2. En la página de selección de proyectos de Cloud Console, selecciona o crea un proyecto de Cloud.

    Ir a la página Selector de proyectos

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud. Obtén información sobre cómo confirmar que tienes habilitada la facturación para tu proyecto.

  4. Habilita la API Firestore.

    Habilita la API

  5. Instala e inicializa el SDK de Cloud.
  6. Configura la herramienta de gcloud para usar tu nuevo proyecto de Google Cloud de la manera siguiente:
    # Configure gcloud for your project
    gcloud config set project PROJECT_ID
    Reemplaza PROJECT_ID por el ID del proyecto de Google Cloud que creaste o seleccionaste anteriormente.

Prepara el proyecto

  1. En la ventana de tu terminal, comienza en un directorio de tu elección y crea un directorio nuevo llamado sessions. Todo el código para este instructivo está dentro del directorio sessions.

  2. Cambia al directorio sessions con el comando siguiente:

    cd sessions
    
  3. Instala las dependencias con el comando siguiente:

    composer require google/cloud-firestore
    

Al término de este instructivo, la estructura final del archivo es similar a la siguiente:

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

Escribe la aplicación

  • En la ventana de tu terminal, crea un archivo llamado index.php con el contenido siguiente:

    <?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');
    }
    

En esta aplicación, se muestran saludos en diferentes idiomas para cada usuario. A los usuarios que regresan siempre se los recibe en el mismo idioma.

Varias ventanas de aplicaciones en las que se muestra un saludo en diferentes idiomas

Antes de que se puedan guardar las preferencias de un usuario en tu aplicación, necesitas una forma de almacenar información sobre el usuario actual en una sesión. En esta app de muestra se usa Firestore para almacenar los datos de las sesiones.

Puedes usar Firestore session handler a fin de usar Firestore para almacenar sesiones de PHP.

En el siguiente diagrama se muestra cómo Firestore controla las sesiones de la aplicación de App Engine.

Diagrama de arquitectura: usuario, App Engine, Firestore

Después de configurar session_set_save_handler, cada solicitud tiene una variable global $_SESSION que puedes usar para acceder a la sesión. Los datos de la sesión se almacenan en Firestore.

Ejecución local

  1. Inicia el servidor web de PHP integrado con el comando siguiente:

    php -S localhost:8080
    
  2. Visualiza la aplicación en el navegador web de la manera siguiente:

    Cloud Shell

    En la barra de herramientas de Cloud Shell, haz clic en Vista previa en la Web Vista previa en la Web y selecciona Vista previa en el puerto 8080.

    Máquina local

    En tu navegador, ve a http://localhost:8080.

    Ves uno de los cinco saludos: "Hello World", "Hallo Welt", "Hola mundo", "Salut le Monde" o "Ciao Mondo". El idioma cambia si abres la página en otro navegador o en modo Incógnito. Puedes ver y editar los datos de las sesiones en Google Cloud Console.

    Sesiones de Firestore en Cloud Console

  3. Para detener el servidor HTTP, presiona Control+C en la ventana de la terminal.

Implementa y ejecuta en App Engine

Puedes usar el entorno estándar de App Engine para compilar y también implementar una aplicación que se ejecute de manera confiable con cargas pesadas y grandes cantidades de datos.

En este instructivo, se usa el entorno estándar de App Engine para implementar el servidor.

  1. En la ventana de tu terminal, crea un archivo app.yaml y copia lo siguiente:

    runtime: php73
    
  2. Implementa la app en App Engine con el siguiente comando:

    gcloud app deploy
    
  3. Para ver la app publicada, ingresa la siguiente URL:

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

    Reemplaza lo siguiente:

El saludo ahora se entrega en un servidor web que se ejecuta en una instancia de App Engine.

Borra sesiones

En PHP, se realiza la recolección de elementos no utilizados (GC) de sesión, la cual quita sesiones antiguas y vencidas en función de tu configuración en php.ini. El controlador de sesiones de Firestore no limpia las sesiones de forma predeterminada, pero, si quieres configurarlo para que lo haga, puedes pasar una opción gcLimit cuando crees el controlador de sesiones:

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

Las sesiones se quitan mediante la GC de sesión probabilística, o cuando se llama de manera explícita a la función session_gc.

Depura la aplicación

Si no puedes conectarte a la aplicación de App Engine, verifica lo siguiente:

  1. Comprueba que los comandos de implementación de gcloud se completaron correctamente y no generaron ningún error. Si hubo errores (por ejemplo, message=Build failed), corrígelos y, luego, intenta implementar la aplicación de App Engine nuevamente.
  2. En Cloud Console, ve a la página Visor de registros.

    Ir a la página Visor de registros

    1. En la lista desplegable Recursos seleccionados recientemente, haz clic en Aplicación de App Engine y, luego, haz clic en Todos module_id. Verás una lista de las solicitudes de cuando visitaste tu aplicación. Si no ves una lista de solicitudes, confirma que seleccionaste Todos module_id en la lista desplegable. Si ves mensajes de error impresos en Cloud Console, comprueba que el código de tu aplicación coincida con el código de la sección sobre escritura de la aplicación web.

    2. Asegúrate de que la API de Firestore esté habilitada.

Limpieza

Borra el proyecto

  1. En Cloud Console, ve a la página Administrar recursos.

    Ir a la página Administrar recursos

  2. En la lista de proyectos, selecciona el proyecto que deseas borrar y haz clic en Borrar .
  3. En el cuadro de diálogo, escribe el ID del proyecto y haz clic en Cerrar para borrar el proyecto.

Borra la instancia de App Engine

  1. En Cloud Console, ve a la página Versiones de App Engine.

    Ir a la página Versiones

  2. Selecciona la casilla de verificación de la versión no predeterminada de la app que deseas borrar.
  3. Haz clic en Borrar para borrar la versión de la app.

Pasos siguientes