実装環境:
PHP 5.4.24
MySQL 5.6.19
OS X 10.9.4/Apache 2.2.26
1.コード
2. はじめに
MySQL を使用してセッションを保存するには、セッション ID、セッション データ、セッションの有効期間という 3 つの主要なデータを保存する必要があります。
セッションの使用方法を考慮すると、InnoDB エンジンを使用する必要はなく、MyISAM エンジンの方が優れたパフォーマンスを実現できます。環境が許せば、MEMORY エンジンの使用を試すことができます。
必要に応じて、セッション データを保存する列に utf8 または utf8mb4 文字セットを使用できますが、セッション ID を保存する列には必要ありません。通常は、ストレージ コストを節約できる ASCII 文字セットを使用できます。
セッションのライフサイクルを保存する列は、プロジェクトのニーズに応じて設計できます。たとえば、日時型、タイムスタンプ型、int 型などです。 datetime 型および int 型の場合、セッションの生成時刻または有効期限を保存できます。
必要に応じて、セッション テーブルの列を拡張し、読み取りおよび書き込み関数を変更して、ユーザー名などの情報を保存するための関連列をサポート (維持) できます。
現在のバージョンでは、session_set_save_handler を通じてカスタム セッション メンテナンス関数を登録するだけで済みます。その前に session_module_name('user') 関数を使用する必要はありません。
read 関数がデータを取得して返すとき、PHP は自動的にデータをデシリアライズします。通常はデータを変更しないでください。
PHP によって write 関数に渡される日付パラメータは、シリアル化後のセッション データです。通常は、データを直接変更しないでください。
このコードのロジックによれば、PHP 構成オプションのセッション有効期間設定は有効ではなくなり、この値は単独で維持できるため、必ずしも get_cfg_var を通じて取得する必要はありません。
sessionMysqlId() 関数は、多数のユーザーと複数の Web サーバーが存在する場合に衝突を回避するためのもので、通常、PHP によって自動的に生成されるセッション ID はユーザーの要件を満たすことができます。
もうだめ
3. 需要
ユーザーの数が非常に多く、アプリケーションを提供するために複数のサーバーが必要な場合、MySQL を使用してセッションを保存すると、セッション ファイルを使用するよりも一定の利点があります。たとえば、ストレージのオーバーヘッドが最小限に抑えられ、ファイル共有による複雑さを回避でき、衝突をより適切に回避でき、セッション ファイル共有よりもパフォーマンスが優れています。一般に、アクセス数が急激に増加すると、データベースを使用してセッションを保存することによって発生する問題が直線的に増加すると、セッション ファイルの使用によって発生する問題はほぼ爆発的に増加します。そうですね、もっと簡単に言ってみましょう。アプリケーションのユーザー数が少ない場合は、実際には PHP にセッションを単独で処理させることができます。MySQL を考慮する必要はありません。
この問題に対しては、配列ストレージを使用し、最終的に複数文字列操作である分離された文字列に出力できます。
サンプルコードをお送りします。
$gb_DBname="charles_friend";//データベース名
$gb_DBuser="charles_friend";//データベース ユーザー名
$gb_DBpass="wxyzoui";//データベース パスワード
$gb_DBHOSTname="localhost";//データベースの名前ホストまたは IP アドレス
$SESS_DBH="";
$SESS_LIFE=get_cfg_var("session.gc_maxlifetime");//セッションの最大有効期間を取得します。
function sess_open($save_path,$session_name){
global $gb_DBHOSTname,$gb_DBname,$gb_DBuser,$gb_DBpass,$SESS_DBH;
if(!$SESS_DBH=mysql_pconnect($gb_DBHOSTname,$gb_DBuser,$gb_DBpass)){
echo "