require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
-class Session extends Memcached_DataObject
+class Session extends Managed_DataObject
{
###START_AUTOCODE
/* the code below is auto generated do not remove the above tag */
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
+ public static function schemaDef()
+ {
+ return array(
+ 'fields' => array(
+ 'id' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'description' => 'session ID'),
+ 'session_data' => array('type' => 'text', 'description' => 'session data'),
+ 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'),
+ 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'),
+ ),
+ 'primary key' => array('id'),
+ 'indexes' => array(
+ 'session_modified_idx' => array('modified'),
+ ),
+ );
+ }
+
static function logdeb($msg)
{
if (common_config('sessions', 'debug')) {
{
self::logdeb("Fetching session '$id'");
- $session = Session::staticGet('id', $id);
+ $session = Session::getKV('id', $id);
if (empty($session)) {
self::logdeb("Couldn't find '$id'");
{
self::logdeb("Writing session '$id'");
- $session = Session::staticGet('id', $id);
+ $session = Session::getKV('id', $id);
if (empty($session)) {
self::logdeb("'$id' doesn't yet exist; inserting.");
{
self::logdeb("Deleting session $id");
- $session = Session::staticGet('id', $id);
+ $session = Session::getKV('id', $id);
if (empty($session)) {
self::logdeb("Can't find '$id' to delete.");
$session->selectAdd();
$session->selectAdd('id');
+ $limit = common_config('sessions', 'gc_limit');
+ if ($limit > 0) {
+ // On large sites, too many sessions to expire
+ // at once will just result in failure.
+ $session->limit($limit);
+ }
+
$session->find();
while ($session->fetch()) {
$result = session_set_save_handler('Session::open', 'Session::close', 'Session::read',
'Session::write', 'Session::destroy', 'Session::gc');
self::logdeb("save handlers result = $result");
+
+ // PHP 5.3 with APC ends up destroying a bunch of object stuff before the session
+ // save handlers get called on request teardown.
+ // Registering an explicit shutdown function should take care of this before
+ // everything breaks on us.
+ register_shutdown_function('Session::cleanup');
+
return $result;
}
+
+ static function cleanup()
+ {
+ session_write_close();
+ }
}