翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
AWS SDK for PHP バージョン 3 での DynamoDB セッションハンドラーの使用
DynamoDB セッションハンドラーは PHP 用カスタムセッションハンドラーで、デベロッパーは Amazon DynamoDB をセッションストアとして使用できます。DynamoDB をセッションのストレージに使用すると、ローカルファイルシステムからセッションを共有の場所に移動することで、分散されたウェブアプリケーションのセッション処理で発生する問題を抑制します。DynamoDB は高速で、スケーラブルで、設定が簡単で、データのレプリケーションを自動的に処理します。
DynamoDB セッションハンドラーは、session_set_save_handler()
関数を使用して DynamoDB オペレーションを PHP のネイティブセッション関数
DynamoDB サービスに関する詳細については、Amazon DynamoDB ホームページ
基本的な使用法
ステップ 1: ハンドラーを登録する
まず、インスタンス化し、セッションハンドラーを登録します。
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();
ステップ 2。セッションを格納するテーブルを作成する
実際にセッションハンドラーを使用する前に、セッションを格納するテーブルを作成する必要があります。Amazon DynamoDB 向け AWSAWS コンソール
このテーブルを作成するときは、プライマリキーの名前として「id」を使用します。また、セッションの自動ガベージコレクションの利点を活用するため、「expires」属性を使用して有効期限属性を設定することもお勧めします。
ステップ 3。通常どおりに PHP セッションを使用する
ハンドラーが登録され、テーブルが完成したら、$_SESSION
superglobal を使用して、セッションに対して読み書きを行うことができます。これは PHP のデフォルトセッションハンドラーを使用する場合と同じです。DynamoDB セッションハンドラーは DynamoDB とのやり取りをカプセル化および抽象化します。これにより、PHP のネイティブセッション関数とインターフェイスを使用できるようになります。
// 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();
構成
次のオプションを使用してセッションハンドラーの動作を設定することができます。すべてのオプションは必要に応じて利用できますが、デフォルトの内容を十分理解してください。
-
table_name
-
セッションを保存する DynamoDB テーブルの名前。これのデフォルトは
'sessions'
です。 -
hash_key
-
DynamoDB セッションテーブル内のハッシュキーの名前。これのデフォルトは
'id'
です。 -
data_attribute
-
セッションデータが格納されている DynamoDB セッションテーブルの属性の名前。これのデフォルトは
'data'
です。 -
data_attribute_type
-
セッションデータが格納されている DynamoDB セッションテーブルの属性のタイプ。このデフォルトは [
'string'
] ですが、オプションで'binary'
に設定することができます。 -
session_lifetime
-
ガーベージコレクションを開始するまでの非アクティブなセッションの継続期間。指定されない場合は、使用される実際の継続期間値は
ini_get('session.gc_maxlifetime')
です。 -
session_lifetime_attribute
-
セッションの有効期限が格納されている DynamoDB セッションテーブルの属性の名前。これのデフォルトは
'expires'
です。 -
consistent_read
-
セッションハンドラーが
GetItem
オペレーションに対して整合性のある読み込みを使用するかどうかを示します。デフォルトはtrue
です。 -
locking
-
セッションのロックを使用するかどうかを指定します。デフォルトは
false
です。 -
batch_config
-
ガベージコレクション中にバッチ削除を使用するように設定します。これらのオプションは、DynamoDB WriteRequestBatch オブジェクトに直接渡されます。
SessionHandler::garbageCollect()
経由でガベージコレクションを手動でトリガーします。 -
max_lock_wait_time
-
セッションハンドラーが、放棄するまでロックの取得を待機する最大時間 (秒単位)。デフォルトは
10
で、セッションのロックでのみ使用されます。 -
min_lock_retry_microtime
-
セッションハンドラーが、ロックの取得を試みる間に待機する最小時間 (マイクロ秒単位)。デフォルトは、
10000
で、セッションのロックでのみ使用されます。 -
max_lock_retry_microtime
-
セッションハンドラーが、ロックの取得を試みる間に待機する最大時間 (マイクロ秒単位)。デフォルトは、
50000
で、セッションのロックでのみ使用されます。
セッションハンドラーを設定するには、ハンドラーをインスタンス化するときに設定オプションを指定します。次のコードでは、すべての設定オプションを指定した例を示します。
$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, ]);
料金
データストレージとデータ転送料金を除き、DynamoDB の使用に関連するコストは、使用するテーブルのプロビジョンドスループット性能に基づいて計算されます (詳細については、「Amazon DynamoDB 料金
読み込みキャパシティーユニットは、サイズが 4 KB である項目に対する、1 秒あたり 1 回の強力な整合性のある読み込み (または 1 秒あたり 2 回の結果整合性のある読み込み) を表します。書き込みキャパシティーユニットは、サイズが 1 KB である項目に対する、1 秒あたり 1 回の書き込みを表します。
最終的に、セッションテーブルに必要なスループットとコストは、予想されるトラフィックおよびセッションサイズとの相関があります。以下の表では、各セッション関数に対して、DynamoDB テーブルで実行される読み取りおよび書き込みオペレーションの量を説明します。
|
|
|
|
|
|
|
|
ガベージコレクション |
|
セッションのロック
DynamoDB セッションハンドラーは、PHP のデフォルトのセッションハンドラー動作を模倣するペシミスティックセッションロックをサポートします。デフォルトでは、DynamoDB セッションハンドラーはこの機能をオフにします。特に Ajax リクエストまたは iflame を使用するときに、アプリケーションがセッションにアクセスして、パフォーマンスのボトルネックとコスト上昇につながる可能性があるからです。有効にする前に、セッションのロックがアプリケーションで必要とされるかどうかを十分に検討します。
セッションのロックを有効にするには、'locking'
をインスタンス化するときに、true
オプションを SessionHandler
に設定してください。
$sessionHandler = SessionHandler::fromClient($dynamoDb, [ 'table_name' => 'sessions', 'locking' => true, ]);
ガベージコレクション
「expires」属性を使用して、DynamoDB テーブルで TTL 属性を設定します。これにより、セッションが自動的にガベージコレクションの対象になり、自分でガベージコレクションを実行する必要がなくなります。
または、DynamoDB セッションハンドラーは、一連の Scan
と BatchWriteItem
オペレーションを使用することでセッションのガベージコレクションをサポートしています。Scan
オペレーション処理の仕様上、すべての期限切れのセッションを検索し、それらを削除するには、ガベージコレクションプロセスに多大なプロビジョンドスループットが必要です。
このため、自動化されたガベージコレクションはサポートされていません。消費スループットのバーストが残りのアプリケーションは中断しない、オフピーク時間中に実行するようにガベージコレクションのスケジュールを設定することがベストプラクティスです。たとえば、夜間の cron ジョブでガベージコレクションを実行するスクリプトをトリガーすることもできます。このスクリプトは、次のように何らかの処理を実行する必要があります。
$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();
'before'
オプションを 'batch_config'
オペレーションの内部で使用して、ガベージコレクションプロセスによって実行される BatchWriteItem
オペレーションに遅延を導入します。これにより、ガベージコレクションが完了するまでにかかる時間は増加しますが、ガベージコレクション中にプロビジョンドスループット性能内、または近くに抑えられるように、DynamoDB セッションハンドラーによって行われるリクエストを分散できます。
$sessionHandler = SessionHandler::fromClient($dynamoDb, [ 'table_name' => 'sessions', 'batch_config' => [ 'before' => function ($command) { $command['@http']['delay'] = 5000; } ] ]); $sessionHandler->garbageCollect();
ベストプラクティス
-
アプリケーションサーバーと同じリージョンまたは地理的に最も近い AWS リージョンにセッションテーブルを作成します。これにより、アプリケーションと DynamoDB データベース間で、レイテンシーが最小になります。
-
使用するセッションテーブルのプロビジョンドスループット性能を慎重に選択します。アプリケーションへの予想されるトラフィックとセッションの予想サイズを考慮します。または、テーブルに対して「オンデマンド」読み取り/書き込みキャパシティーを使用します。
-
AWS マネジメントコンソールまたは Amazon CloudWatch で消費スループットをモニタリングし、アプリケーションのニーズに対応できるようにスループット設定を調整します。
-
セッションのサイズを小さく抑えます (理想的には、1 KB 未満)。セッションが小さいと、パフォーマンスが向上し、必要なプロビジョンドスループット性能が減ります。
-
アプリケーションで必要な場合を除き、セッションのロックを使用しないでください。
-
PHP の組み込みのセッションガベージコレクショントリガーを使用する代わりに、cron ジョブ、または別のスケジューリングメカニズムを使用してガベージコレクションのスケジュールを設定して、オフピークの時間帯中に実行します。便利な
'batch_config'
オプションを使用します。
必要な IAM 許可
DynamoDB セッションハンドラーを使用するには、設定された認証情報に、前のステップで作成した DynamoDB テーブルを使用するためのアクセス許可が必要です。次の IAM ポリシーには必要最小限のアクセス許可が含まれています。このポリシーを使用するには、リソース値を以前に作成したテーブルの Amazon リソースネーム (ARN) で置き換えます。IAM ユーザーポリシーの作成と添付の詳細については、「IAM ユーザーガイド」の「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>" } ] }