デフォルトでは、PHP セッションはファイルを通じて保存されます。これには次のような欠点があります。
セッション ファイルは通常小さいですが、ファイル システムにそのような小さいファイルを多数保存することはスペースの無駄であり、非効率的です。
分散サイトでは、セッション ファイルを使用してセッションを共有するのは困難です。
セッション ファイル方式では、オンライン ユーザーのセッション情報をカウントできません。
上記の問題を解決するには、データベースを使用してセッション情報を保存することが考えられます。
PHP 開発の場合、MySQL を使用してセッションを保存することは非常に良い選択です。 MySQL はメモリ内に構築されるテーブル タイプのヒープを提供します。セッションあたりのデータ量が少ない場合は、パフォーマンスをさらに最適化するためにこのタイプのテーブルの使用を検討できます。ただし、ヒープ タイプのテーブルにはテキスト タイプのフィールドがサポートされていないなど、多くの制限があるため、セッション データ レコードの長さを予測できない場合は、トランザクションを持たない MyISAM タイプのテーブルを選択する方が適切です。ディスクベースのテーブルの処理オーバーヘッドにより、最適なパフォーマンスが得られます。
セッション テーブルの構造は次のとおりです:
DROP TABLE IF EXISTS `sessions`;
CREATE TABLE `sessions` (
`session_id` varchar(32) NOT NULL デフォルト ' '、
user_id` int (10) unsigned not null デフォルト ' 0 '、
`data_value` テキストが null ではない、
` lavisit` タイムスタンプ (14) not null、
主キー(` session_id`),
KEY `user_id` (`user_id`)
) TYPE=MyISAM;
PHP はユーザー セッション モジュールをサポートしており、session_set_save_handler を通じてカスタム セッション処理関数を設定できます。デフォルトの処理モジュールはファイルであるため、session_set_save_handler を使用してセッション処理関数を設定する前に、まず session_module_name('user') を使用してユーザー セッション モジュールを使用するように PHP に指示し、session_start の前に session_set_save_handler を実行する必要があります。
ユーザーセッションデータはセッション処理関数でシリアル化され、セッション変数の 1 つを取り出すことができます。デフォルトでは、session:: unserialize 関数を使用してシリアル化を解除できます。
次のコードは、MySQL を使用して PHP セッションを処理するクラスを定義します。使用される class_mysql.php については、「超シンプルだが超実用的な PHP MySQL クラス」を参照してください。
/**
* @author Ma Bingyao
* @copyright (C) 2005 CoolCode.CN
*/
require_once(“class_mysql.php“);
クラスセッション {
var $db;
function session(&$db) {
$this->db = &$db;
session_module_name('user');
session_set_save_handler(
array(&$this, 'open'),
array(&$this, 'close'),
array (&$this, 'read')、
array(&$this, 'write'),
array(&$this, 'destroy'),
array(&$this, 'gc')
);
session_start();
}
function unserialize($data_value) {
$vars = preg_split(
'/([a-zA-Z_x7f-xff][a-zA-Z0-9] _x7f-xff]*) |/',
$data_value, -1, PREG_SPLIT_NO_EMPTY |
PREG_SPLIT_DELIM_CAPTURE
);
for ($i = 0; $vars[$i]; $i ) {
$result[$vars[$i ]] = unserialize($vars[$i]);
}
$result を返す;
}
function open($path, $name) {
return true;
}
function close() {
return true;
}
function read($session_id) {
$session_id = $this->db->escape_string($session_id);
if ($row = $this-〉db-〉query(“select * from `sessions` where `session_id` = '$session_id' limit 1”)) {
return $row['data_value'] ;
}
else {
$this->db->query(“insert into `sessions` set `session_id` = '$session_id'”);
return 「」;
}
}
function write($session_id, $data_value) {
$data = $this-〉unserialize($data_value);
$session_id = $this->db->escape_string($session_id);
$data_value = $this-〉db-〉escape_string($data_value);
$this->db->query(“update `sessions` set ”
. ”`user_id` = '{$data['user_id']}', ” .「`data_value` =」 '$data_value', “
. “`last_visit` = null “
. = '$session_id'”);
true を返します。
}
function destroy($session_id) {
$session_id = $this->db->escape_string($session_id);
$this->db->query(“delete from `sessions` where `session_id` = '$session_id'”);
true を返します。
}
function gc($lifetime) {
$this->db->query(“delete from `sessions` where unix_timestamp(now()) - unix_timestamp(`last_visit`) > $lifetime” );
true を返します。
}
// user_id ごとにセッションを取得
function get($user_id) {
$user_id = $this->db->escape_string($user_id);
return $this->db->query(“select * from `sessions` where `user_id` = '$user_id'”);
}
// get session list
function lists($page, $rows) {
if ($page == 0)
return $this-〉db-〉クエリ( 「select * from `セッション` order by `user_id`”);
}
else {
$start = ($page - 1) * $rows;
return $this->db->query(“select * from `sessions` order by `user_id` limit $start, $rows“);
}
}
}
?>
このクラスの使用法は非常に簡単で、最初に session_start が使用されていた場合は、それを $session = new session($db) に置き換えるだけです。 $db は、セッション テーブルが配置されているデータベースを表します。
さらに、get メソッドを使用してユーザーのすべてのセッション情報を取得し、lists メソッドを使用してすべてのユーザーのセッションのリストを取得できます。これにより、ユーザー セッションの管理が容易になります。