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.
This commit is contained in:
Brion Vibber 2010-01-04 14:24:16 -08:00
parent e668709ce4
commit 440b9957f9

View File

@ -21,7 +21,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
class Memcached_DataObject extends DB_DataObject class Memcached_DataObject extends DB_DataObject
{ {
/** /**
* Destructor to free global memory resources associated with * Destructor to free global memory resources associated with
* this data object when it's unset or goes out of scope. * this data object when it's unset or goes out of scope.
* DB_DataObject doesn't do this yet by itself. * DB_DataObject doesn't do this yet by itself.
@ -35,6 +35,42 @@ 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 * Wrapper for DB_DataObject's static lookup using memcached
* as backing instead of an in-process cache array. * as backing instead of an in-process cache array.