sessionをDBに保存しました。
適当にさわったり、ブラウザを落としてみて動作を確認してみて下さい。
Session.php
<?php ini_set('session.gc_maxlifetime', 100); ini_set('session.gc_probability', 100); ini_set('session.gc_divisor', 100); session_set_cookie_params(100); class Session implements SessionHandlerInterface { private $_db; private $_fp; public function __construct(){ try{ $this->_fp = fopen("log.txt", "a+"); fwrite($this->_fp, "construct: "."\n"); $this->_db = mysql_connect('localhost', 'root', ''); $db_selected = mysql_select_db('development'); if(!$db_selected){ throw new Exception("SQLException DBの接続に失敗しました"); } if(isset($_COOKIE["PHPSESSID"])){ session_id($_COOKIE["PHPSESSID"]); } }catch(Exception $e){ fwrite($this->_fp, $e->getMessage()."\n"); throw $e; } } public function open($save_path, $session_id) { fwrite($this->_fp, "open: "."\n"); return true; } public function read($session_id) { try{ $session_id = mysql_real_escape_string($session_id); $select_data = "SELECT data " . "FROM sessions " . "WHERE session_id = '" . $session_id . "'"; fwrite($this->_fp, "read: " . $select_data . "\n"); $result = mysql_query($select_data); if(!$result){ throw new Exception("SQLException dataの取得に失敗しました"); } $row = mysql_fetch_row($result); return $row[0]; }catch(Exception $e){ fwrite($this->_fp, $e->getMessage()."\n"); throw $e; } } public function write($session_id, $session_data) { try{ $count_sessions = "SELECT COUNT(*) FROM sessions WHERE session_id= '" . $session_id . "'"; $result = mysql_query($count_sessions); if(!$result){ throw new Exception("SQLException dataのカウントに失敗しました"); } $row = mysql_fetch_row($result); $count = intval($row[0]); if($count > 0){ $update_sessions = "UPDATE sessions " . "SET data='" . $session_data . "'," . "updated_at = now() " . "WHERE session_id = '" . $session_id . "'"; fwrite($this->_fp, "write: " . $update_sessions . "\n"); $result = mysql_query($update_sessions); if(!$result){ throw new Exception("SQLException dataの更新に失敗しました"); } }else{ $insert_sessions = "INSERT INTO sessions(session_id, " . " data," . " created_at)" . "VALUES(" . "'" . $session_id . "'," . "'" . $session_data . "'," . " now())"; fwrite($this->_fp, "write: " . $insert_sessions . "\n"); $result = mysql_query($insert_sessions); if(!$result){ throw new Exception("SQLException dataの登録に失敗しました"); } } }catch(Exception $e){ fwrite($this->_fp, $e->getMessage()."\n"); throw $e; } return true; } public function close() { fwrite($this->_fp, "close: "."\n"); mysql_close($this->_db); return true; } public function destroy($session_id) { try{ $session_id = mysql_real_escape_string($session_id); $delete_sessions = "DELETE FROM sessions WHERE session_id = '" . $session_id . "'"; fwrite($this->_fp, "destroy: " . $delete_sessions . "\n"); $result = mysql_query($delete_sessions); if(!$result){ throw new Exception("SQLException sessionsの削除に失敗しました"); } }catch(Exception $e){ fwrite($this->_fp, $e->getMessage()."\n"); throw $e; } return true; } public function gc($maxlifetime) { try{ $gc_sessions = "DELETE " . "FROM sessions " . "WHERE updated_at < current_timestamp + '-" . $maxlifetime . " secs' " . " OR (created_at < current_timestamp + '-" . $maxlifetime . " secs' AND updated_at IS NULL)"; fwrite($this->_fp, "gc: " . $gc_sessions . "\n"); $result = mysql_query($gc_sessions); if(!$result){ throw new Exception("SQLException gcに失敗しました"); } }catch(Exception $e){ fwrite($this->_fp, $e->getMessage()."\n"); throw $e; } return true; } }db_test.php
<?php require_once 'Session.php'; try{ $handler = new Session(); session_set_save_handler($handler, true); session_start(); $_SESSION["box"] = "test"; var_dump($_SESSION); }catch(Exception $e){ echo $e->getMessage(); }db_test2.php
<?php try{ require_once 'Session.php'; $handler = new Session(); session_set_save_handler($handler, true); session_start(); $_SESSION["box"] = "box"; var_dump($_SESSION); session_destroy(); }catch(Exception $e){ echo $e->getMessage(); }
0 件のコメント:
コメントを投稿