Gestione delle sessioni con Firestore


Questo tutorial mostra come gestire le sessioni su App Engine.

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

Obiettivi

  • Scrivi l'app.
  • Esegui l'app in locale.
  • Eseguire il deployment dell'app su App Engine.

Costi

In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi basata sull'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud potrebbero essere idonei per una prova gratuita.

Una volta completate le attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la pagina Pulizia.

Prima di iniziare

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Firestore API.

    Enable the API

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

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

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Firestore API.

    Enable the API

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. Configura gcloud CLI per utilizzare il tuo nuovo progetto Google Cloud:
    # Configure gcloud for your project
    gcloud config set project PROJECT_ID
    Sostituisci PROJECT_ID con l'ID del 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 di questo tutorial si trova nella 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 del file è simile alla seguente:

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

Scrittura dell'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 i saluti in diverse lingue per ogni utente. Gli utenti di ritorno vengono sempre accolti nella stessa lingua.

Diverse finestre dell'app che mostrano un saluto in diverse lingue.

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

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

Il seguente diagramma illustra il modo in cui Firestore gestisce le sessioni per l'app App Engine.

Diagramma dell'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 alla pagina http://localhost:8080

    Vedi 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 console Google 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 viene eseguita 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 pubblicata, 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 di App Engine.

Eliminazione delle sessioni

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

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

Le sessioni vengono rimosse utilizzando il GC della sessione basato sulla probabilità o quando chiami la funzione session_gc in modo esplicito.

Debug dell'app

Se non riesci a connetterti all'app App Engine, verifica quanto segue:

  1. Verifica che i comandi di deployment di gcloud siano stati completati correttamente e non abbiano restituito alcun errore. 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 su All modulo_id. Viene visualizzato un elenco di richieste effettuate quando hai visitato la tua app. Se non vedi un elenco di richieste, conferma di aver selezionato Tutti i moduli_id dall'elenco a discesa. Se vengono visualizzati 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. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Elimina l'istanza di App Engine

  1. In the Google Cloud console, go to the Versions page for App Engine.

    Go to Versions

  2. Select the checkbox for the non-default app version that you want to delete.
  3. Per eliminare la versione dell'app, fai clic su Elimina.

Passaggi successivi