首先,我不是在寻找“检查您的 PHP 内存限制”或“您需要添加更多内存”或类似内容的答案......我在一台专用机器上,有 8GB 的 RAMS ;其中 512MB 是内存限制。我总是在一行中遇到内存不足错误:
澄清一下:这部分代码属于Joomla!内容管理系统。
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()
尝试相同的语句。内存使用方面的差异非常小。几乎没有。
这是为了您的贡献,我仍在努力找出发生这种情况的原因。
最佳答案
使用 substr 来避免内存不足 preg_replace()
,像这样:
$data = substr($data, strpos($data, '?>') + 3);
作为一般建议,如果您可以使用其他字符串/数组函数完成相同的任务,则不要使用正则表达式,正则表达式函数比核心字符串/数组函数更慢并且消耗更多内存。
这在 PHP 文档中也有明确警告,请参阅一些示例:
http://www.php.net/manual/en/function.preg-match.php#refsect1-function.preg-match-notes http://www.php.net/manual/en/function.preg-split.php#refsect1-function.preg-split-notes
关于php - 内存不足总是在同一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16059802/