]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - classes/Session.php
Merge branch '0.9.x' into 1.0.x
[quix0rs-gnu-social.git] / classes / Session.php
index 79a69a96ea3dc11b1f93672890f1687f2e263fa0..166b89815a85bd42cee95381cc8b7f5484f16633 100644 (file)
@@ -64,8 +64,12 @@ class Session extends Memcached_DataObject
         $session = Session::staticGet('id', $id);
 
         if (empty($session)) {
+            self::logdeb("Couldn't find '$id'");
             return '';
         } else {
+            self::logdeb("Found '$id', returning " .
+                         strlen($session->session_data) .
+                         " chars of data");
             return (string)$session->session_data;
         }
     }
@@ -77,14 +81,24 @@ class Session extends Memcached_DataObject
         $session = Session::staticGet('id', $id);
 
         if (empty($session)) {
+            self::logdeb("'$id' doesn't yet exist; inserting.");
             $session = new Session();
 
             $session->id           = $id;
             $session->session_data = $session_data;
             $session->created      = common_sql_now();
 
-            return $session->insert();
+            $result = $session->insert();
+
+            if (!$result) {
+                common_log_db_error($session, 'INSERT', __FILE__);
+                self::logdeb("Failed to insert '$id'.");
+            } else {
+                self::logdeb("Successfully inserted '$id' (result = $result).");
+            }
+            return $result;
         } else {
+            self::logdeb("'$id' already exists; updating.");
             if (strcmp($session->session_data, $session_data) == 0) {
                 self::logdeb("Not writing session '$id'; unchanged");
                 return true;
@@ -95,7 +109,16 @@ class Session extends Memcached_DataObject
 
                 $session->session_data = $session_data;
 
-                return $session->update($orig);
+                $result = $session->update($orig);
+
+                if (!$result) {
+                    common_log_db_error($session, 'UPDATE', __FILE__);
+                    self::logdeb("Failed to update '$id'.");
+                } else {
+                    self::logdeb("Successfully updated '$id' (result = $result).");
+                }
+
+                return $result;
             }
         }
     }
@@ -106,8 +129,17 @@ class Session extends Memcached_DataObject
 
         $session = Session::staticGet('id', $id);
 
-        if (!empty($session)) {
-            return $session->delete();
+        if (empty($session)) {
+            self::logdeb("Can't find '$id' to delete.");
+        } else {
+            $result = $session->delete();
+            if (!$result) {
+                common_log_db_error($session, 'DELETE', __FILE__);
+                self::logdeb("Failed to delete '$id'.");
+            } else {
+                self::logdeb("Successfully deleted '$id' (result = $result).");
+            }
+            return $result;
         }
     }
 
@@ -124,6 +156,13 @@ class Session extends Memcached_DataObject
         $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()) {
@@ -132,7 +171,10 @@ class Session extends Memcached_DataObject
 
         $session->free();
 
+        self::logdeb("Found " . count($ids) . " ids to delete.");
+
         foreach ($ids as $id) {
+            self::logdeb("Destroying session '$id'.");
             self::destroy($id);
         }
     }
@@ -143,6 +185,18 @@ class Session extends Memcached_DataObject
         $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();
+    }
 }