php.ini の設定 †
セッションIDの受け渡し †
セッション管理 †独自セッション管理の注意点 †DB, memcached 等を使ってセッション管理を行う場合は、以下の点に注意する。
共有フォルダを使ったセッション管理 †
MySQLを使ったセッション管理 †セッション管理用のテーブルを作成し、独自セッションハンドラを定義する。 ■ テーブル sessions CREATE TABLE `sessions` ( `id` varchar(32) NOT NULL default '', `access` int(10) unsigned default NULL, `data` text, PRIMARY KEY (`id`) ) TYPE=MyISAM; ■ session_mysql.ini <?php define("SESSION_DB_HOST", "localhost"); define("SESSION_DB_USER", "test"); define("SESSION_DB_PASS", "test"); define("SESSION_DB_DB", "test"); ?> ■ session_mysql.php <?php require_once("session_mysql.ini"); // ユーザ定義のセッションハンドラを使用 ini_set("session.save_handler", "user") or die("ini_set(session.save_handler) failed."); // セッションハンドラ関数を設定 session_set_save_handler('_open', '_close', '_read', '_write', '_destroy', '_clean'); // PHP5.0.5 以降は session_start() を呼ぶ前に必ずこれを実行 register_shutdown_function('session_write_close'); function _open() { global $_sess_db; $db_host = SESSION_DB_HOST; $db_user = SESSION_DB_USER; $db_pass = SESSION_DB_PASS; $db_db = SESSION_DB_DB; if ($_sess_db = mysql_connect($db_host, $db_user, $db_pass)) { return mysql_select_db($db_db, $_sess_db); } return FALSE; } function _close() { global $_sess_db; return mysql_close($_sess_db); } function _read($id) { global $_sess_db; $id = mysql_real_escape_string($id); $sql = "SELECT data FROM sessions WHERE id = '$id'"; if ($result = mysql_query($sql, $_sess_db)) { if (mysql_num_rows($result)) { $record = mysql_fetch_assoc($result); return $record['data']; } } return ''; } function _write($id, $data) { global $_sess_db; $access = time(); $id = mysql_real_escape_string($id); $access = mysql_real_escape_string($access); $data = mysql_real_escape_string($data); $sql = "REPLACE INTO sessions VALUES ('$id', '$access', '$data')"; return mysql_query($sql, $_sess_db); } function _destroy($id) { global $_sess_db; $id = mysql_real_escape_string($id); $sql = "DELETE FROM sessions WHERE id = '$id'"; return mysql_query($sql, $_sess_db); } function _clean($max) { global $_sess_db; $old = time() - $max; $old = mysql_real_escape_string($old); $sql = "DELETE FROM sessions WHERE access < '$old'"; return mysql_query($sql, $_sess_db); } ?> ■ test.php <?php require_once("session_mysql.php"); // Initialize a session. This call either creates // a new session or re-establishes an existing one. session_start(); // If this is a new session, then the variable // $count will not be registered if (!session_is_registered("count")) { session_register("count"); session_register("start"); $count = 0; $start = time(); } else { $count = $_SESSION['count']; $start = $_SESSION['start']; $count++; } $sessionId = session_id(); $_SESSION['count'] = $count; $_SESSION['start'] = $start; ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" > <html> <head><title>Sessions</title></head> <body> <p>This page points at a session (<%= $sessionId %>) <br>count = <%= $count %>. <br>start = <%= $start %>. <p>This session has lasted <?php $duration = time() - $start; echo "$duration"; ?> seconds. <p><a href="destroy_session.php">destroy session</a> </body> </html> TokyoTyrant? によるセッション管理 †Repcached によるセッション管理 †
memcached によるセッション管理 †memcached はサーバのメモリ上にデータを格納しておく機構を提供するツール。リアルタイムなデータである必要がないデータとかを格納して、有効期限なんかを設定できるらしい。 Memcache関数, Memcacheクラスが使えるようにする †
sharedance によるセッション管理 †Mac OS X 上ではライブラリ等の関係でうまくビルドできなかったため未検証。あしからず。 「ページの有効期限切れ」問題 †
参考URL † |