ホームページ >バックエンド開発 >PHPチュートリアル >PHP_PHP チュートリアルでセッションの保存方法をカスタマイズする
説明
PHP では、session_set_save_handler を定義することで、サーバー セッション データをファイル、APC キャッシュ、Memcache キャッシュ、データベースなどのさまざまなメディアに保存できます。オンライン人数をカウントしたり、特定のメンバーのログイン状況を追い出したりすることができます。
session_set_save_handler のカスタマイズでは、基本的にカスタムの読み取りおよび書き込みメソッドを使用して、システムのデフォルトのセッション読み取りおよび書き込みメソッドをオーバーライドして、セッション管理を実現します。ご質問がございましたら、お気軽にお問い合わせください。
ファクトリークラス
[php]
/**
*CHttpセッション
*httpセッションデータストレージエンジン
*/
クラス CHttpSession {
プライベート静的 $engine;
プライベート静的 $gc_maxlifetime;
パブリック静的関数エンジン( $engineer ) {
$engineer = ucfirst( $engineer );
$engineInstance = "CHttpSession{$engineer}";
$filename = SYS_MODULE 。 '/セッション/' 。 $engineInstance 。 '.php';
if ( !file_exists( $filename )) {
throw new Exception( '致命的: {$filename} ファイルが見つかりません' );
}
require( $filename );
if ( !class_exists( $engineInstance ) ) {
throw new Exception( '致命的: {$engineInstance} オブジェクトが見つかりません' );
}
$handler = new CHttpSession( new $engineInstance );
ini_set( "session.save_handler", "ユーザー" );
ini_set( 'apc.ttl', 3600 );
ini_set( 'apc.user_ttl', 1200 );
ini_set( 'apc.gc_ttl', 3600 );
session_set_save_handler(
array($handler, 'open'),
array($handler, 'close'),
array($handler, 'read'),
array($handler, 'write'),
array($handler, 'destroy'),
配列($handler, 'gc')
);
if ( isset( $_COOKIE['PHPSESSID'] ) ) {
session_start( $_COOKIE['PHPSESSID'] );
}
それ以外の場合 {
session_start( );
setcookie( 'PHPSESSID', session_id(), null, '/', COOKIE_DOMAIN );
}
}
パブリック関数 __construct( & $engine ) {
self::$engine = $engine;
self::$gc_maxlifetime = ini_get( 'session.gc_maxlifetime' );
}
public function read( $id ) {
return self::$engine->fetch( 'session/'.$id );
}
パブリック関数書き込み ( $id , $data ) {
return self::$engine->add( 'session/'.$id, $data, self::$gc_maxlifetime );
}
public function close ( ) {
true を返します。
}
public function destroy ( $id ) {
return self::$engine->delete( 'session/'.$id );
}
パブリック関数 __destruct ( ) {
session_write_close();
}
パブリック関数 gc ( $maxlifetime ) {
true を返します。
}
パブリック関数オープン ( $save_path , $session_name ) {
true を返します。
}
};
具体的な方法
CHttpセッションファイル
[php]
/**
*CFileHttpセッション
* セッション エンジン、セッションをファイル形式で保存します。YPi フレームワークのデフォルトのセッション ストレージ エンジンです
* SESSION_DIR はセッションファイルのストレージパスを設定します
*/
クラス CHttpSessionFile {
public function add( $key, $data, $cg_maxlifetime ) {
$filepath = substr( $key, 7 );
file_put_contents( SESSION_DIR.$filepath, $data );
true を返します。
}
パブリック関数 fetch( $key ) {
$filepath = substr( $key, 7 );
if ( !file_exists(SESSION_DIR.$filepath) ) {
file_put_contents( SESSION_DIR.$filepath, '' );
true を返します。
}
return file_get_contents( SESSION_DIR.$filepath );
}
public function delete( $key ) {
$filepath = substr( $key, 7 );
if ( file_exists( SESSION_DIR.$filepath ) ) {
unlink( SESSION_DIR.$filepath );
}
true を返します。
}
};
CHttpセッションApc
[php]
/**
* CApcHttpセッション
* セッション エンジン、APC キャッシュの形式でセッションを保存します
* SESSION_ENGINE 値を apc に設定して、APC がセッションを保存できるようにします
*/
クラス CHttpSessionApc {
public function add( $key, $data, $cg_maxlifetime ) {
apc_store( $key, $data, $cg_maxlifetime );
true を返します。
}
パブリック関数 fetch( $key ) {
if ( !apc_exists( $key ) ) {
apc_store( $key, '' );
true を返します。
}
return apc_fetch( $key );
}
public function delete( $key ) {
if ( apc_exists( $key ) ) {
apc_delete( $key );
}
true を返します。
}
};
CHttpSessionMemcache
[php]
/**
*CMemcacheHTTPセッション
* セッション エンジン、memcache キャッシュの形式でセッションを保存 *
* SESSION_ENGINE 値を memcache に設定して、memcache がセッションを保存できるようにします
* MEMCACHE_HOST memcache サーバーのアドレスを設定します
* MEMCACHE_PORT memcacheサーバーのアクセスポート番号を設定します
*/
クラス CHttpSessionMemcache {
プライベート静的 $memcache
パブリック関数 __constrct( $config ) {
self::$memcache = 新しい Memcache
self::$memcache->connect( MEMCACHE_HOST, MEMCACHE_PORT );
}
パブリック関数 __destroy() {
self::$memcache->close();
}
パブリック関数 add( $key, $data, $cg_maxlifetime ) {
return self::$memcache->add( $key, $data, $cg_maxlifetime );
}
パブリック関数 fetch( $key ) {
return self::$memcache->get( $key );
}
パブリック関数 delete( $key ) {
return self::$memcache->delete( $key );
}
};
説明例
通常使用される session_start() を次のメソッドに置き換えるだけです。
定義済み('SESSION_ENGINE')||定義('SESSION_ENGINE', 'ファイル'); '../lib/CHttpSession.php' が必要です
CHttpSession::engine( SESSION_ENGINE );
yagasさんのコラムより抜粋
http://www.bkjia.com/PHPjc/478213.html
www.bkjia.com
http://www.bkjia.com/PHPjc/478213.html