针对单例属性的PHP垃圾收集
(具体来说,我在Magento内部工作,但这是一个普通的PHP问题。) 我有一个单例类,它有一个存储大型对象的数组。请考虑以下事项:针对单例属性的PHP垃圾收集,php,memory-management,garbage-collection,Php,Memory Management,Garbage Collection,(具体来说,我在Magento内部工作,但这是一个普通的PHP问题。) 我有一个单例类,它有一个存储大型对象的数组。请考虑以下事项: protected $_categoryObjectCache = array(); /** * @param $key * @param $value */ public function setCategoryObjectCache($key, $value) { $this->_categoryObjectCache[$key] = $
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->\u categoryObjectCache=array()如果我真的需要调用unset($this->\u categoryObjectCache),则希望PHP能够清理代码>和gc_collect_cycles()代码>
当我的缓存开始变得太大时,如何确保清除RAM?PS:我确实知道这种方法的一个问题是,我不能确定这个缓存阵列是超出任意75%内存限制的原因。我不确定有没有办法解决这个问题。