我正在用php编写一个缓存类。它只消耗大量的RAM。为什么我不这样解决它。如果你帮我解决这个问题,我会很高兴的。我在哪里可以犯错误。
致命错误:第65行的Config.php中允许的内存大小为134217728字节(尝试分配24个字节)
我收到上面的错误。
代码就是这样。
class Cache {
var $doNotCache = array("admin","profile");
var $cacheDir = NULL;
var $cacheTime = 21600;
var $caching = false;
var $cacheFile;
var $cacheFileName;
var $cacheLogFile;
var $cacheLog;
function __construct(){
$this -> cacheDir = CACHE_DIR;
$this -> cacheFile = md5($_SERVER['REQUEST_URI']);
$this -> cacheFileName = $this -> cacheDir.'/'.$this-> cacheFile. '.cache';
$this -> cacheLogFile = $this -> cacheDir."/log.txt";
if(!is_dir( $this-> cacheDir )) mkdir( $this-> cacheDir, 0755);
if(file_exists($this->cacheLogFile))
$this->cacheLog = unserialize(file_get_contents($this->cacheLogFile));
else
$this->cacheLog = array();
}
function start(){
$location = array_slice(explode('/',$_SERVER['REQUEST_URI']), 2);
if(!in_array($location[0],$this->doNotCache)){
if(file_exists($this->cacheFileName) && (time() - filemtime($this->cacheFileName)) < $this->cacheTime && $this->cacheLog[$this->cacheFile] == 1){
$this->caching = false;
echo file_get_contents($this->cacheFileName);
exit();
}else{
$this->caching = true;
ob_start();
}
}
}
function end(){
if($this->caching){
file_put_contents($this->cacheFileName,ob_get_contents());
ob_end_flush();
$this->cacheLog[$this->cacheFile] = 1;
if(file_put_contents($this->cacheLogFile,serialize($this->cacheLog)))
return true;
}
}
function purge($location){
$location = base64_encode($location);
$this->cacheLog[$location] = 0;
if(file_put_contents($this->cacheLogFile,serialize($this->cacheLog)))
return true;
else
return false;
}
function purge_all(){
if(file_exists($this->cacheLogFile)){
foreach($this->cacheLog as $key=>$value) $this->cacheLog[$key] = 0;
if(file_put_contents($this->cacheLogFile,serialize($this->cacheLog)))
return true;
else
return false;
}
}
}
的config.php
class Config {
public static function Get($string = '') {
global $Globals;
if($string) {
$config = $Globals['Config'];
$string = explode('/', $string); // Error row.
foreach ($string as $path) {
if(isset($config[$path])) {
$config = $config[$path];
}
}
return $config;
}
return false;
}
}
答案 0 :(得分:1)
如果您的日志文件变大,您可能很容易耗尽内存,因为您的类尝试读入并反序列化整个日志文件。当您的代码当前已编写时,该logFile可以无限制地增长 - 当它变大时,你甚至不用编写任何代码来旋转日志。
您应该具体告诉我们哪条线路正在出现“内存不足”错误。我猜这是内存耗尽的行:
$this->cacheLog = unserialize(file_get_contents($this->cacheLogFile));
我强烈建议你不要在日志文件中读取并尝试将其解析为数组。相反,您应该只追加日志。如果你想避免用一个巨大的日志文件填满你的整个硬盘驱动器,你应该编写一个适当的日志记录功能,当日志文件变得太大时,它将轮换它们。