【发布时间】:2013-04-10 04:49:58
【问题描述】:
首先,我不是在寻找“检查您的 PHP 内存限制”或“您需要添加更多内存”之类的答案......我在一台专用机器上,有 8GB 的 RAMS ;其中512MB是内存限制。我总是在一行出现内存不足错误:
澄清一下:这部分代码属于Joomla!CMS。
function get($id, $group, $checkTime){
$data = false;
$path = $this->_getFilePath($id, $group);
$this->_setExpire($id, $group);
if (file_exists($path)) {
$data = file_get_contents($path);
if($data) {
// Remove the initial die() statement
$data = preg_replace('/^.*\n/', '', $data); // Out of memory here
}
}
return $data;
}
这是 Joomla 缓存的一部分...此函数读取缓存文件并删除阻止直接访问文件的第一行并返回其余数据。
如您所见,该行使用 preg_replace 删除缓存文件中的第一行,该行始终为:
<?php die("Access Denied"); ?>
我的问题是,在我看来,如果初始 $data 很大,它是一个简单的过程(从文件内容中删除第一行)会消耗大量内存吗?如果是这样,解决该问题的最佳方法是什么?我不介意没有 die() 行的缓存文件,我可以采取安全措施并阻止对缓存文件的直接访问。
我错了吗?
更新
正如帖子所建议的那样,正则表达式似乎会产生比解决问题更多的问题。我试过了:
echo memory_get_usage() . "\n";
在正则表达式之后,然后使用substr() 尝试相同的语句。内存使用量的差异非常小。几乎没有。
这是为了你的贡献,我仍在努力找出为什么会发生这种情况。
【问题讨论】:
-
为什么要使用正则表达式从文件中删除第一行? “现在你有两个问题。”
-
我认为您的正则表达式正在将所有行替换为空。最终耗尽所有内存。
-
@Wooble 我添加了一个说明,该代码属于 Joomla!
-
@nl-x 不,它只是删除第一行。我之前和之后都转储了 $data,但它没有改变任何其他内容。
-
@AhmadAlfy 在正则表达式期间内存不足的情况下,你怎么能前后转储?我不是正则表达式专家,但我认为您的表达式从行首 (^) 到换行符 (\n) 表示。并且如果你不指定count参数,它会改变所有的出现。
标签: php performance memory optimization joomla