Gérer les sessions avec Firestore

Ce tutoriel explique comment gérer des sessions sur App Engine.

De nombreuses applications requièrent une fonctionnalité de gestion de session pour l'authentification et le stockage des préférences utilisateur. PHP intègre une mise en œuvre basée sur la mémoire pour assurer cette gestion. Cette mise en œuvre n'est toutefois pas adaptée à une application pouvant être diffusée depuis plusieurs instances. En effet, la session enregistrée dans une instance peut différer des autres instances.

Objectifs

  • Écrire l'application
  • Exécuter l'application en local
  • Déployer l'application sur App Engine

Coûts

Dans ce document, vous utilisez les composants facturables suivants de Google Cloud:

Obtenez une estimation des coûts en fonction de votre utilisation prévue, utilisez le simulateur de coût.

Les nouveaux utilisateurs de peuvent bénéficier d'un essai sans frais. Google Cloud

Une fois que vous avez terminé les tâches décrites dans ce document, supprimez les ressources que vous avez créées pour éviter que des frais vous soient facturés. Pour en savoir plus, consultez la section Effectuer un nettoyage.

Avant de commencer

  1. Connectez-vous à votre Google Cloud compte. Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $de crédits sans frais pour exécuter, tester et déployer des charges de travail.
  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.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  5. Installez la Google Cloud CLI.

  6. Si vous utilisez un fournisseur d'identité (IdP) externe, vous devez d'abord vous connecter à la gcloud CLI avec votre identité fédérée.

  7. Pour initialiser la gcloud CLI, exécutez la commande suivante :

    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.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  11. Installez la Google Cloud CLI.

  12. Si vous utilisez un fournisseur d'identité (IdP) externe, vous devez d'abord vous connecter à la gcloud CLI avec votre identité fédérée.

  13. Pour initialiser la gcloud CLI, exécutez la commande suivante :

    gcloud init
  14. Configurez la gcloud CLI afin d'utiliser votre nouveau Google Cloud projet :
    # Configure gcloud for your project
    gcloud config set project PROJECT_ID
    Remplacez PROJECT_ID par l'ID du projet que vous avez précédemment créé ou sélectionné. Google Cloud

Mettre en place le projet

  1. Dans votre fenêtre de terminal, accédez au répertoire de votre choix et créez-y un répertoire nommé sessions. L'ensemble du code de ce tutoriel se base sur une exécution dans le répertoire sessions.

  2. Accédez donc à ce répertoire sessions :

    cd sessions
    
  3. Installez les dépendances :

    composer require google/cloud-firestore
    

À la fin de ce tutoriel, la structure de fichiers finale ressemble à ce qui suit :

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

Écrire l'application

  • Dans votre fenêtre de terminal, créez un fichier nommé index.php contenant le code suivant :

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

L'application affiche des messages d'accueil dans différentes langues pour chaque utilisateur. Les utilisateurs connus reçoivent toujours les messages d'accueil dans la même langue.

Fenêtres d&#39;application affichant un message d&#39;accueil dans différentes langues.

Pour que votre application puisse stocker les préférences d'un utilisateur, vous devez mettre en œuvre une méthode permettant de stocker les informations sur l'utilisateur actuel dans une session. Dans cet exemple d'application, les données de session sont stockées à l'aide de Firestore.

Vous pouvez utiliser Firestore session handler afin d'exploiter Firestore pour les sessions PHP.

Le schéma suivant décrit la façon dont Firestore gère les sessions pour l'application App Engine.

Schéma de principe : utilisateur, App Engine, Firestore.

Une fois que vous avez défini session_set_save_handler, chaque requête est associée à une variable globale $_SESSION permettant d'accéder à la session. Les données de session sont stockées dans Firestore.

Exécution locale

  1. Démarrez le serveur Web PHP intégré :

    php -S localhost:8080
    
  2. Affichez l'application dans votre navigateur Web :

    Cloud Shell

    Dans la barre d'outils Cloud Shell, cliquez sur Aperçu sur le Web Aperçu sur le Web et sélectionnez Prévisualiser sur le port 8080.

    Machine locale

    Dans votre navigateur, accédez à http://localhost:8080

    L'un des cinq messages d'accueil suivants s'affiche : "Hello World", "Hallo Welt", "Hola mundo", "Salut le Monde" ou "Ciao Mondo". La langue change si vous ouvrez la page dans un autre navigateur ou en mode navigation privée. Vous pouvez consulter et modifier les données de session dans la Google Cloud console.

    Sessions Firestore dans la console Google Cloud .

  3. Dans votre fenêtre de terminal, appuyez sur Control+C pour arrêter le serveur HTTP.

Déployer et exécuter l'application sur App Engine

Vous pouvez utiliser l' environnement standard App Engine pour créer et déployer une application qui s'exécute de manière fiable, même lorsqu'elle est soumise à une charge importante et doit gérer de grandes quantités de données.

Dans ce tutoriel, le serveur est déployé dans l'environnement standard App Engine.

  1. Dans votre fenêtre de terminal, créez un fichier app.yaml et copiez le contenu suivant :

    runtime: php73
    
  2. Déployez l'application sur App Engine :

    gcloud app deploy
    
  3. Pour afficher l'application en direct, saisissez l'URL suivante :

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

    Remplacez les éléments suivants :

Le message d'accueil est désormais diffusé par un serveur Web exécuté sur une instance App Engine.

Supprimer des sessions

PHP dispose d'une fonctionnalité de récupération de mémoire de session, qui supprime les anciennes sessions et les sessions expirées conformément à votre fichier de configuration php.ini. Le gestionnaire de session Firestore ne nettoie pas les sessions par défaut, mais vous pouvez le configurer en transmettant une option gcLimit lors de la création du gestionnaire de session :

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

Les sessions sont supprimées par la fonctionnalité de récupération de mémoire de session qui se base sur la probabilité, ou lorsque vous appelez la fonction session_gc de manière explicite.

Déboguer l'application

Si vous ne parvenez pas à vous connecter à votre application App Engine, vérifiez les éléments suivants :

  1. Vérifiez que les commandes de déploiement gcloud ont bien abouti et n'ont généré aucune erreur. Si des erreurs se sont produites (par exemple, message=Build failed), corrigez-les, puis essayez de redéployer l'application App Engine à nouveau.
  2. Dans la Google Cloud console, accédez à la page Explorateur de journaux.

    Accéder à la page "Explorateur de journaux"

    1. Dans la liste déroulante Ressources sélectionnées récemment, cliquez sur Application App Engine, puis sur Tous les ID de module. La liste des requêtes correspondant à votre accès à l'application s'affiche. Si cette liste n'apparaît pas, vérifiez que vous avez bien sélectionné Tous les ID de module dans la liste déroulante. Si des messages d'erreur s'affichent dans la Google Cloud console, vérifiez que le code de votre application correspond au code décrit dans la section sur l'écriture de l'application Web.

    2. Assurez-vous que l'API Firestore est activée.

Effectuer un nettoyage

Supprimer le projet

  1. Dans la Google Cloud console, accédez à la page Gérer les ressources.

    Accéder à la page "Gérer les ressources"

  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez Arrêter pour supprimer le projet.

Supprimer l'instance App Engine

  1. Dans la Google Cloud console, accédez à la page Versions pour App Engine.

    Accéder à la page "Versions"

  2. Cochez la case correspondant à la version de l'application autre que celle par défaut que vous souhaitez supprimer.
  3. Pour supprimer la version de l'application, cliquez sur Supprimer.

Étape suivante