Gestione delle sessioni con Firestore

Questo tutorial mostra come gestire le sessioni su App Engine.

Molte app richiedono la gestione delle sessioni per l'autenticazione e le preferenze utente. PHP include un'implementazione basata sulla memoria per eseguire questa funzione. Tuttavia, questa implementazione non è adatta a un'app che può essere pubblicata da più istanze, perché la sessione registrata in un'istanza potrebbe differire dalle altre istanze.

Obiettivi

  • Scrivi l'app.
  • Esegui l'app localmente.
  • Esegui il deployment dell'app su App Engine.

Costi

In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il calcolatore prezzi.

I nuovi utenti di Google Cloud potrebbero avere diritto a una prova senza costi.

Al termine delle attività descritte in questo documento, puoi evitare l'addebito di ulteriori costi eliminando le risorse che hai creato. Per saperne di più, consulta Esegui la pulizia.

Prima di iniziare

  1. Accedi al tuo account Google Cloud . Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti senza costi per l'esecuzione, il test e il deployment dei workload.
  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. Installa Google Cloud CLI.

  6. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.

  7. Per inizializzare gcloud CLI, esegui questo comando:

    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. Installa Google Cloud CLI.

  12. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.

  13. Per inizializzare gcloud CLI, esegui questo comando:

    gcloud init
  14. Configura gcloud CLI in modo da utilizzare il tuo nuovo progetto Google Cloud :
    # Configure gcloud for your project
    gcloud config set project PROJECT_ID
    Sostituisci PROJECT_ID con l'ID progetto Google Cloud che hai creato o selezionato in precedenza.

Configurazione del progetto

  1. Nella finestra del terminale, inizia in una directory a tua scelta e crea una nuova directory denominata sessions. Tutto il codice per questo tutorial si trova all'interno della directory sessions.

  2. Passa alla directory sessions:

    cd sessions
    
  3. Installa le dipendenze:

    composer require google/cloud-firestore
    

Al termine di questo tutorial, la struttura finale dei file sarà simile alla seguente:

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

Scrivere l'app

  • Nella finestra del terminale, crea un file denominato index.php con il seguente contenuto:

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

Questa app mostra saluti in lingue diverse per ogni utente. Gli utenti che tornano sul sito vengono sempre accolti nella stessa lingua.

Più finestre dell&#39;app che mostrano un saluto in lingue diverse.

Prima che la tua app possa memorizzare le preferenze di un utente, devi disporre di un modo per memorizzare le informazioni sull'utente corrente in una sessione. Questa app di esempio utilizza Firestore per archiviare i dati di sessione.

Puoi utilizzare Firestore session handler per utilizzare Firestore per le sessioni PHP.

Il seguente diagramma illustra come Firestore gestisce le sessioni per l'app App Engine.

Diagramma dell&#39;architettura: utente, App Engine, Firestore.

Dopo aver impostato session_set_save_handler, ogni richiesta ha una variabile globale $_SESSION che puoi utilizzare per accedere alla sessione. I dati della sessione vengono archiviati in Firestore.

Esecuzione in locale

  1. Avvia il server web PHP integrato:

    php -S localhost:8080
    
  2. Visualizza l'app nel browser web:

    Cloud Shell

    Nella barra degli strumenti di Cloud Shell, fai clic su Anteprima web Anteprima web e seleziona Anteprima sulla porta 8080.

    Macchina locale

    Nel browser, vai a http://localhost:8080

    Viene visualizzato uno dei cinque saluti: "Hello World", "Hallo Welt", "Hola mundo", "Salut le Monde" o "Ciao Mondo". La lingua cambia se apri la pagina in un browser diverso o in modalità di navigazione in incognito. Puoi visualizzare e modificare i dati della sessione nella consoleGoogle Cloud .

    Sessioni Firestore nella console Google Cloud .

  3. Per arrestare il server HTTP, premi Control+C nella finestra del terminale.

Deployment ed esecuzione su App Engine

Puoi utilizzare l'ambiente standard di App Engine per creare ed eseguire il deployment di un'app che funziona in modo affidabile anche se sottoposta a un carico elevato e con grandi quantità di dati.

Questo tutorial utilizza l'ambiente standard di App Engine per eseguire il deployment del server.

  1. Nella finestra del terminale, crea un file app.yaml e copia quanto segue:

    runtime: php73
    
  2. Esegui il deployment dell'app su App Engine:

    gcloud app deploy
    
  3. Per visualizzare l'app live, inserisci il seguente URL:

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

    Sostituisci quanto segue:

Il saluto viene ora fornito da un server web in esecuzione su un'istanza App Engine.

Eliminazione delle sessioni

PHP esegue la garbage collection (GC) della sessione, che rimuove le sessioni vecchie e scadute in base alla configurazione di php.ini. Il gestore delle sessioni Firestore non pulisce le sessioni per impostazione predefinita, ma puoi configurarlo in modo che lo faccia passando un'opzione gcLimit durante la creazione del gestore delle sessioni:

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

Le sessioni vengono rimosse utilizzando la GC delle sessioni basata sulla probabilità o quando chiami esplicitamente la funzione session_gc.

Esecuzione del debug dell'app

Se non riesci a connetterti alla tua app App Engine, controlla quanto segue:

  1. Verifica che i comandi di deployment gcloud siano stati completati correttamente e non abbiano generato errori. Se si sono verificati errori (ad esempio, message=Build failed), correggili e prova a eseguire di nuovo il deployment dell'app App Engine.
  2. Nella console Google Cloud , vai alla pagina Esplora log.

    Vai alla pagina Esplora log

    1. Nell'elenco a discesa Risorse selezionate di recente, fai clic su Applicazione App Engine, quindi fai clic su Tutti module_id. Viene visualizzato un elenco di richieste relative alle tue visite all'app. Se non vedi un elenco di richieste, verifica di aver selezionato Tutti i module_id dall'elenco a discesa. Se visualizzi messaggi di errore stampati nella console Google Cloud , verifica che il codice dell'app corrisponda al codice nella sezione relativa alla scrittura dell'app web.

    2. Assicurati che l'API Firestore sia abilitata.

Esegui la pulizia

Elimina il progetto

  1. Nella console Google Cloud , vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona quello che vuoi eliminare, quindi fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.

Elimina l'istanza App Engine

  1. Nella console Google Cloud , vai alla pagina Versioni per App Engine.

    Vai a Versioni

  2. Seleziona la casella di controllo per la versione dell'app non predefinita che vuoi eliminare.
  3. Per eliminare la versione dell'app, fai clic su Elimina.

Passaggi successivi