Sitzungen mit Cloud Firestore verarbeiten


In dieser Anleitung wird gezeigt, wie Sitzungen in App Engine verarbeitet werden.

Viele Anwendungen benötigen eine Sitzungsverarbeitung zur Authentifizierung und für Nutzereinstellungen. PHP bietet eine arbeitsspeicherbasierte Implementierung zum Ausführen dieser Funktion. Diese Implementierung eignet sich jedoch nicht für eine Anwendung, die über mehrere Instanzen bereitgestellt werden kann, da sich die Sitzung, die in einer bestimmten Instanz aufgezeichnet wird, von Sitzungen in anderen Instanzen unterscheiden kann.

Lernziele

  • Anwendung schreiben
  • Anwendung lokal ausführen
  • Anwendung in App Engine bereitstellen

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Nach Abschluss der in diesem Dokument beschriebenen Aufgaben können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.

Hinweise

  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. Konfigurieren Sie die gcloud CLI für die Verwendung Ihres neuen Google Cloud-Projekts:
    # Configure gcloud for your project
    gcloud config set project PROJECT_ID
    Ersetzen Sie PROJECT_ID durch die Google Cloud-Projekt-ID, die Sie zuvor erstellt oder ausgewählt haben.

Projekt einrichten

  1. Beginnen Sie im Terminalfenster in einem Verzeichnis Ihrer Wahl und erstellen Sie ein neues Verzeichnis mit dem Namen sessions. Der gesamte Code für diese Anleitung befindet sich im Verzeichnis sessions.

  2. Wechseln Sie in das Verzeichnis sessions:

    cd sessions
    
  3. Installieren Sie die Abhängigkeiten:

    composer require google/cloud-firestore
    

Am Ende dieser Anleitung sieht die endgültige Dateistruktur etwa so aus:

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

Anwendung schreiben

  • Erstellen Sie im Terminalfenster eine Datei mit dem Namen index.php mit folgendem Inhalt:

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

In dieser Anwendung werden Begrüßungen in verschiedenen Sprachen für jeden Nutzer angezeigt. Wiederkehrende Nutzer werden immer in derselben Sprache begrüßt.

Mehrere Anwendungsfenster mit einer Begrüßung in verschiedenen Sprachen

Bevor sich in der Anwendung die Einstellungen für einen Nutzer speichern lassen, benötigen Sie eine Möglichkeit zum Speichern der Informationen über den aktuellen Nutzer in einer Sitzung. In dieser Beispielanwendung werden Sitzungsdaten mit Firestore gespeichert.

Sie können den Firestore session handler verwenden, um Firestore für PHP-Sitzungen einzusetzen.

Das folgende Diagramm veranschaulicht, wie Firestore Sitzungen für die App Engine-Anwendung verarbeitet.

Diagramm der Architektur: Nutzer, App Engine, Firestore

Nachdem Sie session_set_save_handler festgelegt haben, enthält jede Anfrage eine globale $_SESSION-Variable, mit der Sie auf die Sitzung zugreifen können. Die Sitzungsdaten werden in Firestore gespeichert.

Lokal ausführen

  1. Starten Sie den integrierten PHP-Webserver:

    php -S localhost:8080
    
  2. Sehen Sie sich die App in Ihrem Webbrowser an:

    Cloud Shell

    Klicken Sie in der Symbolleiste von Cloud Shell auf Webvorschau Webvorschau und wählen Sie Vorschau auf Port 8080 aus.

    Lokaler Computer

    Rufen Sie im Browser http://localhost:8080 auf.

    Eine dieser fünf Begrüßungen wird angezeigt: "Hello World", "Hallo Welt", "Hola mundo", "Salut le Monde" oder "Ciao Mondo". Die Sprache ändert sich, wenn Sie die Seite in einem anderen Browser oder im Inkognitomodus öffnen. Sie können die Sitzungsdaten in der Google Cloud Console ansehen und bearbeiten.

    Firestore-Sitzungen in der Google Cloud Console

  3. Drücken Sie im Terminalfenster Control+C, um den HTTP-Server zu beenden.

In App Engine bereitstellen und ausführen

Mit der App Engine-Standardumgebung können Sie eine Anwendung erstellen und bereitstellen, die zuverlässig unter hoher Last und mit großen Datenmengen ausgeführt wird.

In dieser Anleitung wird der Server mithilfe der App Engine-Standardumgebung bereitgestellt.

  1. Erstellen Sie im Terminalfenster eine app.yaml-Datei und kopieren Sie Folgendes:

    runtime: php73
    
  2. Stellen Sie die Anwendung in App Engine bereit:

    gcloud app deploy
    
  3. Geben Sie die folgende URL ein, um die aktive Anwendung anzusehen:

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

    Ersetzen Sie Folgendes:

Die Begrüßung wird nun von einem Webserver bereitgestellt, der in einer App Engine-Instanz ausgeführt wird.

Sitzungen löschen

PHP führt die automatische Speicherbereinigung für Sitzungen aus. Dabei werden alte und abgelaufene Sitzungen gemäß Ihrer php.ini-Konfiguration entfernt. Der Firestore-Sitzungs-Handler bereinigt Sitzungen standardmäßig nicht, aber Sie können ihn dazu konfigurieren. Hierfür übergeben Sie dem Sitzungs-Handler bei der Erstellung die Option gcLimit:

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

Sitzungen werden mithilfe der auf Wahrscheinlichkeit basierenden automatischen Speicherbereinigung für Sitzungen entfernt oder wenn Sie die Funktion session_gc explizit aufrufen.

Fehler in der Anwendung beheben

Wenn Sie keine Verbindung zu Ihrer App Engine-Anwendung herstellen können, prüfen Sie Folgendes:

  1. Überprüfen Sie, ob die gcloud-Bereitstellungsbefehle erfolgreich ausgeführt wurden und keine Fehler ausgegeben haben. Wenn Fehler wie message=Build failed aufgetreten sind, beheben Sie diese und stellen Sie die App Engine-Anwendung noch einmal bereit.
  2. Rufen Sie in der Google Cloud Console die Seite Log-Explorer auf.

    Zur Seite „Log-Explorer“

    1. Klicken Sie in der Drop-down-Liste Kürzlich ausgewählte Ressourcen auf App Engine-Anwendung und dann auf Alle Werte für module_id. Es wird eine Liste der Anfragen abgerufen, die Sie beim Besuch Ihrer Anwendung gestellt haben. Wenn keine Anfragenliste angezeigt wird, bestätigen Sie, dass Sie Alle Werte für module_id aus der Drop-down-Liste ausgewählt haben. Wenn Fehlermeldungen in der Google Cloud Console angezeigt werden, prüfen Sie, ob der Code Ihrer Anwendung mit dem Code im Abschnitt zum Schreiben der Webanwendung übereinstimmt.

    2. Prüfen Sie, ob die Firestore API aktiviert ist.

Bereinigen

Projekt löschen

  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.

App Engine-Instanz löschen

  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. Klicken Sie zum Löschen der Anwendungsversion auf Löschen.

Nächste Schritte