ホームページ  >  記事  >  バックエンド開発  >  MySQL_PHP チュートリアルを使用した PHP セッションの開始

MySQL_PHP チュートリアルを使用した PHP セッションの開始

WBOY
WBOYオリジナル
2016-07-21 15:58:25721ブラウズ

デフォルトでは、PHP セッションはファイルを通じて保存されます。これには次のような欠点があります:

セッション ファイルは通常小さいですが、ファイル数が多くなります。このような小さいファイルをファイル システムに多数保存することはスペースの無駄であり、効率的ではありません。
分散サイトではセッション ファイルを使用してセッションを共有するのは困難です。
セッション ファイル方式では、オンライン ユーザーのセッション情報をカウントすることはできません。
上記の問題を解決するには、データベースを使用してセッション情報を保存することが考えられます。

PHP 開発の場合、セッションを保存するには MySQL が非常に良い選択です。 MySQL はメモリ内に構築されるテーブル タイプのヒープを提供します。セッションあたりのデータ量が少ない場合は、パフォーマンスをさらに最適化するためにこのタイプのテーブルの使用を検討できます。ただし、ヒープ タイプのテーブルにはテキスト タイプのフィールドがサポートされていないなど、多くの制限があるため、セッション データ レコードの長さを予測できない場合は、トランザクションを持たない MyISAM タイプのテーブルを選択する方が適切です。ディスクベースのテーブルの処理オーバーヘッドにより、最適なパフォーマンスが得られます。

以下はセッションテーブルの構造です:

DROP TABLE IF EXISTS `sessions`;
CREATE TABLE `sessions` (
`session_id` varchar(32) NOT NULL default '',
`user_id` int(10) ) unsigned NOT NULL デフォルト '0'、
`data_value` テキスト NOT NULL、
`last_visit` timestamp(14) NOT NULL、
`session_id`)、
`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 を実行する必要があります。

ユーザーセッションデータはセッション処理関数でシリアル化されます。デフォルトでは、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_set_save_handler(
array(&$this, 'open'),
array(&$this, 'close'),
array(&$this , '読み取り'),
array(&$this, '書き込み') 、
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」
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 sessions list
function lists($page, $rows) {
if ($page == 0) {
return $this->db ->query(“select * from `セッション` order by `ユーザー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 メソッドを使用してすべてのユーザーのセッションリストを取得できます。これにより、ユーザー セッションの管理が容易になります。​

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/317569.html技術記事デフォルトでは、PHP セッションはファイルを通じて保存されます。これには次のような欠点があります: セッション ファイルは一般的に小さいですが、ファイル数が多く、ファイル システムに多くの...
を保存します。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。