Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
针对单例属性的PHP垃圾收集_Php_Memory Management_Garbage Collection - Fatal编程技术网

针对单例属性的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] = $

(具体来说,我在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->\u categoryObjectCache=array()unset($this->\u categoryObjectCache),则希望PHP能够清理
gc_collect_cycles()


当我的缓存开始变得太大时,如何确保清除RAM?

PS:我确实知道这种方法的一个问题是,我不能确定这个缓存阵列是超出任意75%内存限制的原因。我不确定有没有办法解决这个问题。