Menangani sesi dengan Firestore


Tutorial ini menunjukkan cara menangani sesi di App Engine.

Banyak aplikasi memerlukan penanganan sesi untuk autentikasi dan preferensi pengguna. PHP hadir dengan implementasi berbasis memori untuk menjalankan fungsi ini. Namun, implementasi ini tidak cocok untuk aplikasi yang dapat disalurkan dari beberapa instance, karena sesi yang direkam dalam satu instance mungkin berbeda dari instance lainnya.

Tujuan

  • Tulis aplikasi.
  • Jalankan aplikasi secara lokal.
  • Deploy aplikasi di App Engine.

Biaya

Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.

Sebelum memulai

  1. Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  2. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  3. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  4. Aktifkan API Firestore.

    Mengaktifkan API

  5. Menginstal Google Cloud CLI.
  6. Untuk initialize gcloud CLI, jalankan perintah berikut:

    gcloud init
  7. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  8. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  9. Aktifkan API Firestore.

    Mengaktifkan API

  10. Menginstal Google Cloud CLI.
  11. Untuk initialize gcloud CLI, jalankan perintah berikut:

    gcloud init
  12. Konfigurasikan gcloud CLI untuk menggunakan project Google Cloud baru Anda:
    # Configure gcloud for your project
    gcloud config set project PROJECT_ID
    Ganti PROJECT_ID dengan project ID Google Cloud yang Anda buat atau pilih sebelumnya.

Menyiapkan project

  1. Di jendela terminal, mulai dari direktori pilihan Anda dan buat direktori baru bernama sessions. Semua kode untuk tutorial ini ada dalam direktori sessions.

  2. Ubah ke direktori sessions:

    cd sessions
    
  3. Instal dependensinya:

    composer require google/cloud-firestore
    

Di akhir tutorial ini, struktur file akhir mirip dengan berikut ini:

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

Menulis aplikasi

  • Di jendela terminal, buat file bernama index.php dengan konten berikut:

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

Aplikasi ini menampilkan salam dalam berbagai bahasa untuk setiap pengguna. Pengguna yang kembali akan selalu disambut dalam bahasa yang sama.

Beberapa jendela aplikasi menampilkan salam dalam berbagai bahasa.

Sebelum aplikasi Anda dapat menyimpan preferensi bagi pengguna, Anda memerlukan cara untuk menyimpan informasi tentang pengguna saat ini dalam sebuah sesi. Aplikasi contoh ini menggunakan Firestore untuk menyimpan data sesi.

Anda dapat menggunakan Firestore session handler untuk menggunakan Firestore untuk sesi PHP.

Diagram berikut mengilustrasikan cara Firestore menangani sesi untuk aplikasi App Engine.

Diagram arsitektur: pengguna, App Engine, Firestore.

Setelah menetapkan session_set_save_handler, setiap permintaan memiliki variabel global $_SESSION yang dapat Anda gunakan untuk mengakses sesi. Data sesi disimpan di Firestore.

Menjalankan proses secara lokal

  1. Mulai server web PHP bawaan:

    php -S localhost:8080
    
  2. Lihat aplikasi di browser web:

    Cloud Shell

    Di toolbar Cloud Shell, klik Web preview Pratinjau web lalu pilih Preview on port 8080.

    Komputer lokal

    Di browser Anda, buka http://localhost:8080

    Anda akan melihat salah satu dari lima salam: “Hello World”, “Hallo Welt”, “Hola mundo”, “Salut le Monde”, atau “Ciao Mondo”. Bahasa akan berubah jika Anda membuka halaman di browser lain atau dalam mode samaran. Anda dapat melihat dan mengedit data sesi di Konsol Google Cloud.

    Sesi Firestore di Konsol Google Cloud.

  3. Untuk menghentikan server HTTP, di jendela terminal, tekan Control+C.

Men-deploy dan menjalankan aplikasi di App Engine

Anda dapat menggunakan lingkungan standar App Engine untuk membangun dan men-deploy aplikasi yang berjalan dengan andal dalam beban berat dan dengan data dalam jumlah besar.

Tutorial ini menggunakan lingkungan standar App Engine untuk men-deploy server.

  1. Di jendela terminal, buat file app.yaml dan salin perintah berikut:

    runtime: php73
    
  2. Deploy aplikasi di App Engine:

    gcloud app deploy
    
  3. Untuk melihat aplikasi live, masukkan URL berikut:

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

    Ganti kode berikut:

Salam sekarang dikirimkan oleh server web yang berjalan pada instance App Engine.

Menghapus sesi

PHP menjalankan pembersihan sampah memori (GC) sesi, yang menghapus sesi lama dan yang telah berakhir sesuai dengan konfigurasi php.ini Anda. Pengendali sesi Firestore tidak membersihkan sesi secara default, tetapi Anda dapat mengonfigurasinya untuk melakukannya dengan meneruskan opsi gcLimit saat membuat pengendali sesi:

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

Sesi dihapus menggunakan GC sesi berbasis probabilitas, atau saat Anda memanggil fungsi session_gc secara eksplisit.

Men-debug aplikasi

Jika Anda tidak dapat terhubung ke aplikasi App Engine, periksa hal-hal berikut:

  1. Pastikan perintah deployment gcloud berhasil diselesaikan dan tidak menghasilkan error apa pun. Jika ada error (misalnya, message=Build failed), perbaiki, lalu coba deploy aplikasi App Engine lagi.
  2. Di Konsol Google Cloud, buka halaman Logs Explorer.

    Buka halaman Logs Explorer

    1. Di menu drop-down Last selected resources, klik App Engine Application, lalu klik All module_id. Anda akan melihat daftar permintaan saat mengunjungi aplikasi. Jika Anda tidak melihat daftar permintaan, konfirmasi bahwa Anda telah memilih All module_id dari menu drop-down. Jika Anda melihat pesan error yang dicetak ke Google Cloud Console, pastikan kode aplikasi Anda cocok dengan kode di bagian tentang penulisan aplikasi web.

    2. Pastikan Firestore API diaktifkan.

Pembersihan

Menghapus project

  1. Di konsol Google Cloud, buka halaman Manage resource.

    Buka Manage resource

  2. Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Menghapus instance App Engine

  1. Di konsol Google Cloud, buka halaman Versi untuk App Engine.

    Buka Versi

  2. Pilih kotak centang untuk versi aplikasi non-default yang ingin Anda hapus.
  3. Untuk menghapus versi aplikasi, klik Hapus.

Langkah selanjutnya