X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=classes%2FMemcached_DataObject.php;h=be8137573d31530862a1e63f05bd63d605c89902;hb=e119362fde9eabb27d48c94a98624aeae68e436c;hp=753fe954e06495a231776d3f50fce09b7930ba95;hpb=1455d60b06df11f7b765040a4195ded288711ae0;p=quix0rs-gnu-social.git diff --git a/classes/Memcached_DataObject.php b/classes/Memcached_DataObject.php index 753fe954e0..be8137573d 100644 --- a/classes/Memcached_DataObject.php +++ b/classes/Memcached_DataObject.php @@ -23,6 +23,29 @@ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; class Memcached_DataObject extends DB_DataObject { + /** + * Destructor to free global memory resources associated with + * this data object when it's unset or goes out of scope. + * DB_DataObject doesn't do this yet by itself. + */ + + function __destruct() + { + $this->free(); + if (method_exists('DB_DataObject', '__destruct')) { + parent::__destruct(); + } + } + + /** + * 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)) { @@ -39,6 +62,13 @@ class Memcached_DataObject extends DB_DataObject } else { $i = DB_DataObject::staticGet($cls, $k, $v); 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(); } return $i; @@ -93,6 +123,11 @@ class Memcached_DataObject extends DB_DataObject } static function cacheKey($cls, $k, $v) { + if (is_object($cls) || is_object($j) || is_object($v)) { + $e = new Exception(); + common_log(LOG_ERR, __METHOD__ . ' object in param: ' . + str_replace("\n", " ", $e->getTraceAsString())); + } return common_cache_key(strtolower($cls).':'.$k.':'.$v); }