<?php
/**
* 文件缓存类
* @author flynetcn
* @site wwww.jb200.com
*/
class FileCache
{
const CACHE_DIR = '/tmp/cache';
private $dir;
private $expire = 300;
/**
* @param $strDir 缓存子目录(方便清cache)
*/
function __construct($strDir='')
{
if ($strDir) {
$this->dir = self::CACHE_DIR.'/'.$strDir;
}
}
private function getFileName($strKey)
{
return $this->dir.'/'.$strKey;
}
public function setExpire($intSecondNum)
{
if ($intSecondNum<10 || !is_int($intSecondNum)) {
return false;
}
$this->expire = $intSecondNum;
return true;
}
public function getExpire()
{
return $this->expire;
}
public function get($strKey)
{
$strFileName = $this->getFileName($strKey);
if (
!@file_exists($strFileName)) {
return false;
}
if (filemtime($strFileName) < (time()-$this->expire)) {
return false;
}
$intFileSize = filesize($strFileName);
if ($intFileSize == 0) {
return false;
}
if (!$fp = @fopen($strFileName, 'rb')) {
return false;
}
flock($fp, LOCK_SH);
$cacheData = unserialize(fread($fp, $intFileSize));
flock($fp, LOCK_UN);
fclose($fp);
return $cacheData;
}
public function set($strKey, $cacheData)
{
if (!is_dir($this->dir)) {
if (
!@mkdir($this->dir, 0755, true)) {
trigger_error("mkdir({$this->dir}, 0755, true) failed", E_USER_ERROR);
return false;
}
}
$strFileName = $this->getFileName($strKey);
if (@file_exists($strFileName)) {
$intMtime = filemtime($strFileName);
} else {
$intMtime = 0;
}
if (!$fp = fopen($strFileName,'wb')) {
return false;
}
if (!flock($fp, LOCK_EX+LOCK_NB)) {
fclose($fp);
return false;
}
if (time() - $intMtime < 1) {
flock($fp, LOCK_UN);
fclose($fp);
return false;
}
fseek($fp, 0);
ftruncate($fp, 0);
fwrite($fp, serialize($cacheData));
flock($fp, LOCK_UN);
fclose($fp);
@chmod($strFileName, 0755);
return true;
}
}