こんにちは 「スマートセッション」のトピックに関する記事を見たので、提案されたものをすべての点で上回る、本当にスマートなスキームを共有することにしました。
挑戦する「すべてのコンピューターでログアウトする」オプションを使用して、ユーザーセッションと認証の最適なシステムを実装します。 システムをクラッシュ(memcachedの再起動)から保護し、メモリを効率的に使用します。
実装1.ストレージのラッパーを作成する必要があります(コード番号1を参照)。 コードをシステムに適合させる必要があります(たとえば、memcacheオブジェクトへのパスを指定します)。
2. $ session-> start()を使用します。 セッションに本当にアクセスする必要がある場合にのみ(たとえば、承認コントローラーで)。 セッションIDを取得するには、$ session-> getId()を使用します。
3.認証するには、DBMSにテーブルを入力します(コードNo. 2を参照)。 セッション識別子とそれに対応するユーザーIDを保存します。 認証データが正常に入力された場合、対応する行をテーブルに挿入し、キー「al」を追加する必要があります=> memcached。
特定のユーザーがページにアクセスする場合、$ session-> getId()を要求する必要があります。文字列が返される場合は、対応するmemcachedを最初に確認し、見つからない場合はauthsessionsテーブルを要求(およびmemcachedに挿入)して、受信したUIDを次のように使用しますそのような。
「すべてのコンピューターでログアウト」ボタンをクリックすると、そのようなUIDを使用してテーブルからすべての認証セッションを照会し、最初にDBMSから削除し、次にmemcachedから削除する必要があります。
コード番号1:
<?php
$session = new session;
class session
{
public $lifeTime = 86400;
public $started = FALSE;
public function __construct ()
{
ini_set( 'session.cookie_lifetime' ,157680000);
ini_set( 'session.cookie_domain' ,COOKDOMAIN);
ini_set( 'session.name' ,COOKPREFIX. 'sid' );
ini_set( 'session.use_trans_sid' ,0);
ini_set( 'session.use_cookies' ,1);
}
public function getId()
{
$sn = ini_get( 'session.name' );
if (isset($_REQUEST[$sn])) { return gpcvar_str($_REQUEST[$sn]);}
if (isset($_COOKIE[$sn])) { return gpcvar_str($_COOKIE[$sn]);}
$ this ->start();
return session_id();
}
public function start()
{
if ($ this ->started) { return ;}
$ this ->started = TRUE;
$sn = ini_get( 'session.name' );
session_set_save_handler(array($ this , 'open' ),array($ this , 'close' ),array($ this , 'read' ),array($ this , 'write' ),array($ this , 'destroy' ),array($ this , 'gc' ));
if (isset($_REQUEST[$sn])) {$_COOKIE[$sn] = gpcvar_str($_REQUEST[$sn]);}
session_start();
}
public function session_write_close() { return TRUE;}
public function open($savePath,$sessName) { return TRUE;}
public function close() { return TRUE;}
public function read($sessID) { return xE::$memcache-> get ( 'sess.' .$sessID);}
public function write($sessID,$sessData) { return xE::$memcache-> set ( 'sess.' .$sessID,$sessData,$ this ->lifeTime);}
public function destroy($sessID) { return xE::$memcache->delete( 'sess.' .$sessID);}
public function gc($lt) { return TRUE;}
}
function gpcvar_str(&$ var ) { if (is_array($ var )) { return '' ;} return strval($ var );}
* This source code was highlighted with Source Code Highlighter .
コード番号2:
CREATE TABLE `xE_authsessions` (
`session_id` char (32) CHARACTER SET ascii COLLATE ascii_bin NOT NULL ,
`uid` int (11) NOT NULL ,
`ip` int (10) unsigned NOT NULL ,
`ctime` int (11) NOT NULL ,
PRIMARY KEY (`session_id`),
KEY `uid` (`uid`)
) ENGINE=InnoDB;
* This source code was highlighted with Source Code Highlighter .