(具体来说,我在Magento内部工作,但这是一个普通的PHP问题。)
我有一个单例类,其中包含一个存储大对象的数组。请考虑以下事项:
protected $_categoryObjectCache = array();
/**
* @param $key
* @param $value
*/
public function setCategoryObjectCache($key, $value) {
$this->_categoryObjectCache[$key] = $value;
if ($this->nearingMemoryLimit()) {
unset($this->_categoryObjectCache);
if (function_exists('gc_collect_cycles')) {
gc_collect_cycles();
}
$this->_categoryObjectCache = array();
}
}
/**
* @return bool
*/
protected function nearingMemoryLimit() {
$memory_limit = ini_get('memory_limit');
if (preg_match('/^(\d+)(.)$/', $memory_limit, $matches)) {
if ($matches[2] == 'M') {
$memory_limit = $matches[1] * 1024 * 1024; // nnnM -> nnn MB
} else if ($matches[2] == 'K') {
$memory_limit = $matches[1] * 1024; // nnnK -> nnn KB
}
}
return ((memory_get_usage() / $memory_limit) > 0.75);
}
(方法setCategoryObjectCache()
不会经常被调用。通常我只是使用一个名为getCategoryObjectCache()
的方法从该数组中读取
我将这个单例缓存构建为导入器的一部分,该导入器遍历数千种产品并将它们分配给各种类别。但是,这需要加载每个类别模型并使用它的内置方法来查找父/子关系,状态等。查找产品想要关联的每个类别,一遍又一遍地为每个产品引发数千个重复的模型实例化对于同一类别。此缓存解决了这个问题。
问题是,我担心缓存变得太大了。由于这些巨大的模型对象,Magento因性能问题而臭名昭着。所以我编写了上面的代码来查看当前脚本的内存使用情况,如果脚本太接近最大化内存,则清除缓存。
我不知道的是,这是否真的有效。 PHP垃圾收集对我来说是一个很大的神秘之处,我不确定我是否可以调用$this->_categoryObjectCache = array();
并期望PHP清理,或者我是否真的需要调用unset($this->_categoryObjectCache);
和{{ 1}}
如果我的缓存开始变得太大,我怎样才能确保清除RAM?