Skip DB_DataObject's in-process cache for static gets on CLI processes.

The local process cache would grow forever, keeping things stuck in memory and preventing GC.
This commit is contained in:
Brion 2009-12-22 15:08:44 -08:00 committed by Brion Vibber
parent 6aa4a555dc
commit 38877a4922

View File

@ -37,6 +37,15 @@ class Memcached_DataObject extends DB_DataObject
} }
} }
/**
* 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) function &staticGet($cls, $k, $v=null)
{ {
if (is_null($v)) { if (is_null($v)) {
@ -53,6 +62,13 @@ class Memcached_DataObject extends DB_DataObject
} else { } else {
$i = DB_DataObject::staticGet($cls, $k, $v); $i = DB_DataObject::staticGet($cls, $k, $v);
if ($i) { if ($i) {
// DB_DataObject's in-process lookup cache interferes with GC
// to cause massive memory leaks in long-running processes.
if (php_sapi_name() == 'cli') {
$i->_clear_cache();
}
// Now store it into the shared memcached, if present...
$i->encache(); $i->encache();
} }
return $i; return $i;