From: Brion Vibber <brion@status.net>
Date: Mon, 4 Jan 2010 22:38:56 +0000 (-0800)
Subject: Exclude process-specific link & result cache references from serialized Memcached_Dat... 
X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=78214c4e067616828478d600d500b34b6fcb9061;p=quix0rs-gnu-social.git

Exclude process-specific link & result cache references from serialized Memcached_Data_Object instances.
Should fix seemingly-random bugs due to destructor free()ing local resources by mistake.

cherry-pick from 0.9.x
---

diff --git a/classes/Memcached_DataObject.php b/classes/Memcached_DataObject.php
index d89a9421e6..ca360d4111 100644
--- a/classes/Memcached_DataObject.php
+++ b/classes/Memcached_DataObject.php
@@ -37,6 +37,51 @@ class Memcached_DataObject extends DB_DataObject
         }
     }
 
+    /**
+     * Magic function called at serialize() time.
+     *
+     * We use this to drop a couple process-specific references
+     * from DB_DataObject which can cause trouble in future
+     * processes.
+     *
+     * @return array of variable names to include in serialization.
+     */
+    function __sleep()
+    {
+        $vars = array_keys(get_object_vars($this));
+        $skip = array('_DB_resultid', '_link_loaded');
+        return array_diff($vars, $skip);
+    }
+
+    /**
+     * Magic function called at unserialize() time.
+     *
+     * Clean out some process-specific variables which might
+     * be floating around from a previous process's cached
+     * objects.
+     *
+     * Old cached objects may still have them.
+     */
+    function __wakeup()
+    {
+        // Refers to global state info from a previous process.
+        // Clear this out so we don't accidentally break global
+        // state in *this* process.
+        $this->_DB_resultid = null;
+        
+        // We don't have any local DBO refs, so clear these out.
+        $this->_link_loaded = false;
+    }
+
+    /**
+     * Wrapper for DB_DataObject's static lookup using memcached
+     * as backing instead of an in-process cache array.
+     *
+     * @param string $cls classname of object type to load
+     * @param mixed $k key field name, or value for primary key
+     * @param mixed $v key field value, or leave out for primary key lookup
+     * @return mixed Memcached_DataObject subtype or false
+     */
     function &staticGet($cls, $k, $v=null)
     {
         if (is_null($v)) {