From 48d671ac39de0ebfd36858d784d3066ecbb89c10 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sat, 27 Jun 2009 05:15:59 -0700 Subject: session storage --- classes/Session.php | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100755 classes/Session.php (limited to 'classes/Session.php') diff --git a/classes/Session.php b/classes/Session.php new file mode 100755 index 000000000..9b48dabac --- /dev/null +++ b/classes/Session.php @@ -0,0 +1,42 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; + +class Session extends Memcached_DataObject +{ + ###START_AUTOCODE + /* the code below is auto generated do not remove the above tag */ + + public $__table = 'session'; // table name + public $id; // varchar(32) primary_key not_null + public $session_data; // text() + public $created; // datetime() not_null + public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP + + /* Static get */ + function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('Session',$k,$v); } + + /* the code above is auto generated do not remove the tag below */ + ###END_AUTOCODE +} -- cgit v1.2.3-54-g00ecf From 0ca22cf6e2bd80247520f7c1f83535f8de5fed0a Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sat, 27 Jun 2009 05:48:22 -0700 Subject: a memcached_dataobject class for saving sessions --- classes/Session.php | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/util.php | 7 +++++- 2 files changed, 73 insertions(+), 1 deletion(-) (limited to 'classes/Session.php') diff --git a/classes/Session.php b/classes/Session.php index 9b48dabac..6f13c7d27 100755 --- a/classes/Session.php +++ b/classes/Session.php @@ -39,4 +39,71 @@ class Session extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + + static function open($save_path, $session_name) + { + return true; + } + + static function close() + { + return true; + } + + static function read($id) + { + $session = Session::staticGet('id', $id); + + if (empty($session)) { + return ''; + } else { + return (string)$session->session_data; + } + } + + static function write($id, $session_data) + { + $session = Session::staticGet('id', $id); + + if (empty($session)) { + $session = new Session(); + + $session->id = $id; + $session->session_data = $session_data; + $session->created = common_sql_now(); + + return $session->insert(); + } else { + $session->session_data = $session_data; + + return $session->update(); + } + } + + static function destroy($id) + { + $session = Session::staticGet('id', $id); + + if (!empty($session)) { + return $session->delete(); + } + } + + static function gc($maxlifetime) + { + $epoch = time() - $maxlifetime; + + $qry = 'DELETE FROM session ' . + 'WHERE modified < "'.$epoch.'"'; + + $session = new Session(); + + $session->query($qry); + } + + static function setSaveHandler() + { + session_set_save_handler('Session::open', 'Session::close', 'Session::read', + 'Session::write', 'Session::destroy', 'Session::gc'); + } } diff --git a/lib/util.php b/lib/util.php index e5a8eaea0..b3496a09e 100644 --- a/lib/util.php +++ b/lib/util.php @@ -828,7 +828,12 @@ function common_date_iso8601($dt) function common_sql_now() { - return strftime('%Y-%m-%d %H:%M:%S', time()); + return common_sql_date(time()); +} + +function common_sql_date($datetime) +{ + return strftime('%Y-%m-%d %H:%M:%S', $datetime); } function common_redirect($url, $code=307) -- cgit v1.2.3-54-g00ecf From 5a600a02d134861933ab8d8b49245eb8b77982ec Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sat, 27 Jun 2009 06:24:06 -0700 Subject: fixup perms on auto-generated files --- classes/Session.php | 0 classes/laconica.ini | 0 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 classes/Session.php mode change 100755 => 100644 classes/laconica.ini (limited to 'classes/Session.php') diff --git a/classes/Session.php b/classes/Session.php old mode 100755 new mode 100644 diff --git a/classes/laconica.ini b/classes/laconica.ini old mode 100755 new mode 100644 -- cgit v1.2.3-54-g00ecf From 7af94dc12562b8114f0f823dc8438234125022da Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sat, 27 Jun 2009 07:09:21 -0700 Subject: some debugging code for sessions --- classes/Session.php | 24 +++++++++++++++++++++--- lib/util.php | 1 + 2 files changed, 22 insertions(+), 3 deletions(-) (limited to 'classes/Session.php') diff --git a/classes/Session.php b/classes/Session.php index 6f13c7d27..5c48e4aa9 100644 --- a/classes/Session.php +++ b/classes/Session.php @@ -40,6 +40,11 @@ class Session extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + static function logdeb($msg) + { + common_debug("Session: " . $msg); + } + static function open($save_path, $session_name) { return true; @@ -52,6 +57,8 @@ class Session extends Memcached_DataObject static function read($id) { + self::logdeb("Fetching session '$id'"); + $session = Session::staticGet('id', $id); if (empty($session)) { @@ -63,6 +70,8 @@ class Session extends Memcached_DataObject static function write($id, $session_data) { + self::logdeb("Writing session '$id'"); + $session = Session::staticGet('id', $id); if (empty($session)) { @@ -82,6 +91,8 @@ class Session extends Memcached_DataObject static function destroy($id) { + self::logdeb("Deleting session $id"); + $session = Session::staticGet('id', $id); if (!empty($session)) { @@ -91,6 +102,8 @@ class Session extends Memcached_DataObject static function gc($maxlifetime) { + self::logdeb("garbage collection (maxlifetime = $maxlifetime)"); + $epoch = time() - $maxlifetime; $qry = 'DELETE FROM session ' . @@ -98,12 +111,17 @@ class Session extends Memcached_DataObject $session = new Session(); - $session->query($qry); + $result = $session->query($qry); + + self::logdeb("garbage collection result = $result"); } static function setSaveHandler() { - session_set_save_handler('Session::open', 'Session::close', 'Session::read', - 'Session::write', 'Session::destroy', 'Session::gc'); + self::logdeb("setting save handlers"); + $result = session_set_save_handler('Session::open', 'Session::close', 'Session::read', + 'Session::write', 'Session::destroy', 'Session::gc'); + self::logdeb("save handlers result = $result"); + return $result; } } diff --git a/lib/util.php b/lib/util.php index 2face6777..c8da8c7dd 100644 --- a/lib/util.php +++ b/lib/util.php @@ -145,6 +145,7 @@ function common_ensure_session() } if (!common_have_session()) { if (common_config('sessions', 'handle')) { + common_log(LOG_INFO, "Using our own session handler"); Session::setSaveHandler(); } @session_start(); -- cgit v1.2.3-54-g00ecf From 871f598dcc81d7018f25590d767591722bb977f2 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sat, 27 Jun 2009 08:11:09 -0700 Subject: debug flag for sessions --- README | 2 ++ classes/Session.php | 4 +++- lib/common.php | 3 ++- 3 files changed, 7 insertions(+), 2 deletions(-) (limited to 'classes/Session.php') diff --git a/README b/README index 7f8748b3f..c8c529ed8 100644 --- a/README +++ b/README @@ -1287,6 +1287,8 @@ handle: boolean. Whether we should register our own PHP session-handling code (using the database and memcache if enabled). Defaults to false. Setting this to true makes some sense on large or multi-server sites, but it probably won't hurt for smaller ones, either. +debug: whether to output debugging info for session storage. Can help + with weird session bugs, sometimes. Default false. Troubleshooting =============== diff --git a/classes/Session.php b/classes/Session.php index 5c48e4aa9..93fd99baa 100644 --- a/classes/Session.php +++ b/classes/Session.php @@ -42,7 +42,9 @@ class Session extends Memcached_DataObject static function logdeb($msg) { - common_debug("Session: " . $msg); + if (common_config('sessions', 'debug')) { + common_debug("Session: " . $msg); + } } static function open($save_path, $session_name) diff --git a/lib/common.php b/lib/common.php index 3a5913f85..e2936f075 100644 --- a/lib/common.php +++ b/lib/common.php @@ -255,7 +255,8 @@ $config = 'search' => array('type' => 'fulltext'), 'sessions' => - array('handle' => false), // whether to handle sessions ourselves + array('handle' => false, // whether to handle sessions ourselves + 'debug' => false), // debugging output for sessions ); $config['db'] = &PEAR::getStaticProperty('DB_DataObject','options'); -- cgit v1.2.3-54-g00ecf