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
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
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 adalah
ini_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 adalahtrue
. -
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 melalui
SessionHandler::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).
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 |
|
Baca melalui |
|
Menulis melalui |
|
Hapus melalui |
|
Pengumpulan Sampah |
|
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
-
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.
-
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.
-
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.
-
Jaga ukuran sesi Anda kecil (idealnya kurang dari 1 KB). Sesi kecil berkinerja lebih baik dan membutuhkan kapasitas throughput yang lebih sedikit.
-
Jangan gunakan penguncian sesi kecuali aplikasi Anda membutuhkannya.
-
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>" } ] }