Menggunakan penangan sesi DynamoDB dengan Versi 3 AWS SDK for PHP - AWS SDK for PHP

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Menggunakan penangan sesi DynamoDB dengan Versi 3 AWS SDK for PHP

DynamoDB Session Handler adalah penangan sesi kustom untuk PHP yang memungkinkan pengembang menggunakan Amazon DynamoDB sebagai toko sesi. Menggunakan DynamoDB untuk penyimpanan sesi mengurangi masalah yang terjadi dengan penanganan sesi dalam aplikasi web terdistribusi dengan memindahkan sesi dari sistem file lokal dan ke lokasi bersama. DynamoDB cepat, terukur, mudah diatur, dan menangani replikasi data Anda secara otomatis.

DynamoDB Session Handler menggunakan session_set_save_handler() fungsi untuk menghubungkan operasi DynamoDB ke fungsi sesi asli PHP untuk memungkinkan penurunan penggantian yang sebenarnya. Ini termasuk dukungan untuk fitur seperti penguncian sesi dan pengumpulan sampah, yang merupakan bagian dari penangan sesi default PHP.

Untuk informasi selengkapnya tentang layanan DynamoDB, lihat beranda Amazon DynamoDB.

Penggunaan dasar

Langkah 1: Daftarkan handler

Pertama, buat instance dan daftarkan session handler.

use Aws\DynamoDb\SessionHandler; $dynamoDb = new Aws\DynamoDb\DynamoDbClient([ 'region'=>'us-east-1' // Since version 3.277.10 of the SDK, ]); // the 'version' parameter defaults to 'latest'. $sessionHandler = SessionHandler::fromClient($dynamoDb, [ 'table_name' => 'sessions' ]); $sessionHandler->register();

Langkah 2. Buat tabel untuk menyimpan sesi Anda

Sebelum Anda benar-benar dapat menggunakan pengendali sesi, Anda perlu membuat tabel untuk menyimpan sesi. Anda dapat melakukan ini sebelumnya dengan menggunakan AWSKonsol untuk Amazon DynamoDB, atau dengan menggunakan. AWS SDK for PHP

Saat membuat tabel ini gunakan 'id' sebagai nama kunci utama. Juga disarankan untuk menyiapkan atribut Time To Live menggunakan atribut 'expires' untuk mendapatkan keuntungan dari pengumpulan sesi sampah otomatis.

Langkah 3. Gunakan sesi PHP seperti biasanya

Setelah penangan sesi terdaftar dan tabel ada, Anda dapat menulis dan membaca dari sesi menggunakan $_SESSION superglobal, seperti yang biasa Anda lakukan dengan penangan sesi default PHP. DynamoDB Session Handler merangkum dan mengabstraksi interaksi dengan DynamoDB dan memungkinkan Anda untuk hanya menggunakan fungsi sesi asli PHP dan antarmuka.

// Start the session session_start(); // Alter the session data $_SESSION['user.name'] = 'jeremy'; $_SESSION['user.role'] = 'admin'; // Close the session (optional, but recommended) session_write_close();

Konfigurasi

Anda dapat mengonfigurasi perilaku pengendali sesi menggunakan opsi berikut. Semua opsi bersifat opsional, tetapi pastikan untuk memahami apa defaultnya.

table_name

Nama tabel DynamoDB untuk menyimpan sesi. Ini default ke. 'sessions'

hash_key

Nama kunci hash dalam tabel sesi DynamoDB. Ini default ke. 'id'

data_attribute

Nama atribut dalam tabel sesi DynamoDB tempat data sesi disimpan. Ini default ke. 'data'

data_attribute_type

Jenis atribut dalam tabel sesi DynamoDB di mana data sesi disimpan. Ini default ke'string', tetapi secara opsional dapat diatur ke. 'binary'

session_lifetime

Masa pakai sesi yang tidak aktif sebelum itu harus menjadi sampah yang dikumpulkan. Jika tidak disediakan, nilai seumur hidup aktual yang akan digunakan adalahini_get('session.gc_maxlifetime').

session_lifetime_attribute

Nama atribut dalam tabel sesi DynamoDB di mana waktu kedaluwarsa sesi disimpan. Ini default ke. 'expires'

consistent_read

Apakah penangan sesi harus menggunakan pembacaan yang konsisten untuk GetItem operasi. Defaultnya adalah true.

locking

Apakah akan menggunakan penguncian sesi. Defaultnya adalah false.

batch_config

Konfigurasi yang digunakan untuk menghapus batch selama pengumpulan sampah. Opsi ini diteruskan langsung ke objek DynamoDB WriteRequestBatch. Memicu pengumpulan sampah secara manual melaluiSessionHandler::garbageCollect().

max_lock_wait_time

Waktu maksimum (dalam detik) bahwa pengendali sesi harus menunggu untuk mendapatkan kunci sebelum menyerah. Default untuk adalah 10 dan hanya digunakan dengan penguncian sesi.

min_lock_retry_microtime

Waktu minimum (dalam mikrodetik) bahwa pengendali sesi harus menunggu di antara upaya untuk mendapatkan kunci. Defaultnya adalah 10000 dan hanya digunakan dengan penguncian sesi.

max_lock_retry_microtime

Waktu maksimum (dalam mikrodetik) bahwa pengendali sesi harus menunggu di antara upaya untuk memperoleh kunci. Defaultnya adalah 50000 dan hanya digunakan dengan penguncian sesi.

Untuk mengonfigurasi Session Handler, tentukan opsi konfigurasi saat Anda membuat instance handler. Kode berikut adalah contoh dengan semua opsi konfigurasi yang ditentukan.

$sessionHandler = SessionHandler::fromClient($dynamoDb, [ 'table_name' => 'sessions', 'hash_key' => 'id', 'data_attribute' => 'data', 'data_attribute_type' => 'string', 'session_lifetime' => 3600, 'session_lifetime_attribute' => 'expires', 'consistent_read' => true, 'locking' => false, 'batch_config' => [], 'max_lock_wait_time' => 10, 'min_lock_retry_microtime' => 5000, 'max_lock_retry_microtime' => 50000, ]);

Harga

Selain biaya penyimpanan data dan transfer data, biaya yang terkait dengan penggunaan DynamoDB dihitung berdasarkan kapasitas throughput yang disediakan pada tabel Anda (lihat detail harga Amazon DynamoDB). Throughput diukur dalam satuan kapasitas tulis dan kapasitas baca. Beranda Amazon DynamoDB mengatakan:

Satuan kapasitas baca mewakili satu pembacaan yang sangat konsisten per detik (atau dua pembacaan yang akhirnya konsisten per detik) untuk item sebesar 4 KB. Satuan kapasitas tulis mewakili satu tulis per detik untuk item sebesar 1 KB.

Pada akhirnya, throughput dan biaya yang diperlukan untuk tabel sesi Anda akan berkorelasi dengan lalu lintas dan ukuran sesi yang Anda harapkan. Tabel berikut menjelaskan jumlah operasi baca dan tulis yang dilakukan pada tabel DynamoDB Anda untuk setiap fungsi sesi.

Baca melalui session_start()

  • 1 operasi baca (hanya 0,5 jika consistent_read adafalse).

  • (Bersyarat) 1 operasi tulis untuk menghapus sesi jika sudah kedaluwarsa.

Baca melalui session_start() (Menggunakan penguncian sesi)

  • Minimal 1 operasi tulis.

  • (Bersyarat) Operasi penulisan tambahan untuk setiap upaya memperoleh kunci pada sesi. Berdasarkan waktu tunggu kunci yang dikonfigurasi dan opsi coba lagi.

  • (Bersyarat) 1 operasi tulis untuk menghapus sesi jika sudah kedaluwarsa.

Menulis melalui session_write_close()

  • 1 operasi tulis.

Hapus melalui session_destroy()

  • 1 operasi tulis.

Pengumpulan Sampah

  • 0,5 operasi baca per 4 KB data dalam tabel untuk memindai sesi kedaluwarsa.

  • 1 operasi tulis per item kedaluwarsa untuk menghapusnya.

Penguncian sesi

DynamoDB Session Handler mendukung penguncian sesi pesimis untuk meniru perilaku pengendali sesi default PHP. Secara default, DynamoDB Session Handler memiliki fitur ini dimatikan karena dapat menjadi hambatan kinerja dan menaikkan biaya, terutama ketika aplikasi mengakses sesi saat menggunakan permintaan Ajax atau iframe. Pertimbangkan dengan cermat apakah aplikasi Anda memerlukan penguncian sesi sebelum mengaktifkannya.

Untuk mengaktifkan penguncian sesi, setel 'locking' opsi ke true saat Anda membuat instance. SessionHandler

$sessionHandler = SessionHandler::fromClient($dynamoDb, [ 'table_name' => 'sessions', 'locking' => true, ]);

Pengumpulan sampah

Siapkan atribut TTL di tabel DynamoDB Anda, menggunakan atribut 'kedaluwarsa'. Ini akan secara otomatis mengumpulkan sampah sesi Anda dan menghindari kebutuhan untuk mengumpulkan sampah sendiri.

Atau, DynamoDB Session Handler mendukung pengumpulan sampah sesi dengan menggunakan serangkaian dan operasi. Scan BatchWriteItem Karena sifat dari bagaimana Scan operasi bekerja, dan untuk menemukan semua sesi kedaluwarsa dan menghapusnya, proses pengumpulan sampah dapat memerlukan banyak throughput yang disediakan.

Untuk alasan ini, kami tidak mendukung pengumpulan sampah otomatis. Praktik yang lebih baik adalah menjadwalkan pengumpulan sampah terjadi selama waktu off-peak ketika ledakan throughput yang dikonsumsi tidak akan mengganggu sisa aplikasi. Misalnya, Anda dapat memiliki pekerjaan cron malam memicu skrip untuk menjalankan pengumpulan sampah. Skrip ini perlu melakukan sesuatu seperti berikut ini.

$sessionHandler = SessionHandler::fromClient($dynamoDb, [ 'table_name' => 'sessions', 'batch_config' => [ 'batch_size' => 25, 'before' => function ($command) { echo "About to delete a batch of expired sessions.\n"; } ] ]); $sessionHandler->garbageCollect();

Anda juga dapat menggunakan 'before' opsi di dalam 'batch_config' untuk memperkenalkan penundaan pada BatchWriteItem operasi yang dilakukan oleh proses pengumpulan sampah. Ini akan meningkatkan jumlah waktu yang dibutuhkan pengumpulan sampah untuk menyelesaikan, tetapi ini dapat membantu Anda menyebarkan permintaan yang dibuat oleh DynamoDB Session Handler untuk membantu Anda tetap dekat dengan atau dalam kapasitas throughput yang disediakan selama pengumpulan sampah.

$sessionHandler = SessionHandler::fromClient($dynamoDb, [ 'table_name' => 'sessions', 'batch_config' => [ 'before' => function ($command) { $command['@http']['delay'] = 5000; } ] ]); $sessionHandler->garbageCollect();

Praktik terbaik

  1. Buat tabel sesi Anda di AWS Wilayah yang secara geografis paling dekat dengan atau di Wilayah yang sama dengan server aplikasi Anda. Ini memastikan latensi terendah antara aplikasi Anda dan database DynamoDB.

  2. Pilih kapasitas throughput yang disediakan dari tabel sesi Anda dengan hati-hati. Pertimbangkan lalu lintas yang diharapkan ke aplikasi Anda dan ukuran sesi yang diharapkan. Atau gunakan mode kapasitas Baca/Tulis 'On Demand' untuk tabel Anda.

  3. Pantau throughput yang Anda konsumsi melalui AWS Management Console atau dengan Amazon CloudWatch, dan sesuaikan pengaturan throughput Anda sesuai kebutuhan untuk memenuhi permintaan aplikasi Anda.

  4. Jaga ukuran sesi Anda kecil (idealnya kurang dari 1 KB). Sesi kecil berkinerja lebih baik dan membutuhkan kapasitas throughput yang lebih sedikit.

  5. Jangan gunakan penguncian sesi kecuali aplikasi Anda membutuhkannya.

  6. Alih-alih menggunakan pemicu pengumpulan sampah sesi bawaan PHP, jadwalkan pengumpulan sampah Anda melalui pekerjaan cron, atau mekanisme penjadwalan lainnya, untuk dijalankan selama jam-jam sibuk. Gunakan 'batch_config' opsi untuk keuntungan Anda.

Izin IAM yang diperlukan

Untuk menggunakan SessionHhandler DynamoDB, kredenal yang dikonfigurasi harus memiliki izin untuk menggunakan tabel DynamoDB yang Anda buat pada langkah sebelumnya. Kebijakan IAM berikut berisi izin minimum yang Anda butuhkan. Untuk menggunakan kebijakan ini, ganti nilai Resource dengan Amazon Resource Name (ARN) dari tabel yang Anda buat sebelumnya. Untuk informasi selengkapnya tentang membuat dan melampirkan kebijakan IAM, lihat Mengelola Kebijakan IAM di Panduan Pengguna IAM.

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "dynamodb:GetItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:Scan", "dynamodb:BatchWriteItem" ], "Effect": "Allow", "Resource": "arn:aws:dynamodb:<region>:<account-id>:table/<table-name>" } ] }