为大家分享很全的php文件缓存,供大家参考,具体内容如下
<?php
class
cache
{
private
static
$_instance
= null;
protected
$_options
=
array
(
'cache_dir'
=>
"./"
,
'file_name_prefix'
=>
'cache'
,
'mode'
=>
'1'
,
//mode 1 为serialize model 2为保存为可执行文件
);
/**
* 得到本类实例
*
* @return Ambiguous
*/
public
static
function
getInstance()
{
if
(self::
$_instance
=== null)
{
self::
$_instance
=
new
self();
}
return
self::
$_instance
;
}
/**
* 得到缓存信息
*
* @param string $id
* @return boolean|array
*/
public
static
function
get(
$id
)
{
$instance
= self::getInstance();
//缓存文件不存在
if
(!
$instance
->has(
$id
))
{
return
false;
}
$file
=
$instance
->_file(
$id
);
$data
=
$instance
->_fileGetContents(
$file
);
if
(
$data
[
'expire'
] == 0 || time() <
$data
[
'expire'
])
{
return
$data
[
'contents'
];
}
return
false;
}
/**
* 设置一个缓存
*
* @param string $id 缓存id
* @param array $data 缓存内容
* @param int $cacheLife 缓存生命 默认为0无限生命
*/
public
static
function
set(
$id
,
$data
,
$cacheLife
= 0)
{
$instance
= self::getInstance();
$time
= time();
$cache
=
array
();
$cache
[
'contents'
] =
$data
;
$cache
[
'expire'
] =
$cacheLife
=== 0 ? 0 :
$time
+
$cacheLife
;
$cache
[
'mtime'
] =
$time
;
$file
=
$instance
->_file(
$id
);
return
$instance
->_filePutContents(
$file
,
$cache
);
}
/**
* 清除一条缓存
*
* @param string cache id
* @return void
*/
public
static
function
delete
(
$id
)
{
$instance
= self::getInstance();
if
(!
$instance
->has(
$id
))
{
return
false;
}
$file
=
$instance
->_file(
$id
);
//删除该缓存
return
unlink(
$file
);
}
/**
* 判断缓存是否存在
*
* @param string $id cache_id
* @return boolean true 缓存存在 false 缓存不存在
*/
public
static
function
has(
$id
)
{
$instance
= self::getInstance();
$file
=
$instance
->_file(
$id
);
if
(!
is_file
(
$file
))
{
return
false;
}
return
true;
}
/**
* 通过缓存id得到缓存信息路径
* @param string $id
* @return string 缓存文件路径
*/
protected
function
_file(
$id
)
{
$instance
= self::getInstance();
$fileNmae
=
$instance
->_idToFileName(
$id
);
return
$instance
->_options[
'cache_dir'
] .
$fileNmae
;
}
/**
* 通过id得到缓存信息存储文件名
*
* @param $id
* @return string 缓存文件名
*/
protected
function
_idToFileName(
$id
)
{
$instance
= self::getInstance();
$prefix
=
$instance
->_options[
'file_name_prefix'
];
return
$prefix
.
'---'
.
$id
;
}
/**
* 通过filename得到缓存id
*
* @param $id
* @return string 缓存id
*/
protected
function
_fileNameToId(
$fileName
)
{
$instance
= self::getInstance();
$prefix
=
$instance
->_options[
'file_name_prefix'
];
return
preg_replace(
'/^'
.
$prefix
.
'---(.*)$/'
,
'$1'
,
$fileName
);
}
/**
* 把数据写入文件
*
* @param string $file 文件名称
* @param array $contents 数据内容
* @return bool
*/
protected
function
_filePutContents(
$file
,
$contents
)
{
if
(
$this
->_options[
'mode'
] == 1)
{
$contents
= serialize(
$contents
);
}
else
{
$time
= time();
$contents
=
"<?php\n"
.
" // mktime: "
.
$time
.
"\n"
.
" return "
.
var_export(
$contents
, true).
"\n?>"
;
}
$result
= false;
$f
= @
fopen
(
$file
,
'w'
);
if
(
$f
) {
@
flock
(
$f
, LOCK_EX);
fseek
(
$f
, 0);
ftruncate(
$f
, 0);
$tmp
= @fwrite(
$f
,
$contents
);
if
(!(
$tmp
=== false)) {
$result
= true;
}
@fclose(
$f
);
}
@
chmod
(
$file
,0777);
return
$result
;
}
/**
* 从文件得到数据
*
* @param sring $file
* @return boolean|array
*/
protected
function
_fileGetContents(
$file
)
{
if
(!
is_file
(
$file
))
{
return
false;
}
if
(
$this
->_options[
'mode'
] == 1)
{
$f
= @
fopen
(
$file
,
'r'
);
@
$data
=
fread
(
$f
,
filesize
(
$file
));
@fclose(
$f
);
return
unserialize(
$data
);
}
else
{
return
include
$file
;
}
}
/**
* 构造函数
*/
protected
function
__construct()
{
}
/**
* 设置缓存路径
*
* @param string $path
* @return self
*/
public
static
function
setCacheDir(
$path
)
{
$instance
= self::getInstance();
if
(!
is_dir
(
$path
)) {
exit
(
'file_cache: '
.
$path
.
' 不是一个有效路径 '
);
}
if
(!
is_writable
(
$path
)) {
exit
(
'file_cache: 路径 "'
.
$path
.
'" 不可写'
);
}
$path
= rtrim(
$path
,
'/'
) .
'/'
;
$instance
->_options[
'cache_dir'
] =
$path
;
return
$instance
;
}
/**
* 设置缓存文件前缀
*
* @param srting $prefix
* @return self
*/
public
static
function
setCachePrefix(
$prefix
)
{
$instance
= self::getInstance();
$instance
->_options[
'file_name_prefix'
] =
$prefix
;
return
$instance
;
}
/**
* 设置缓存存储类型
*
* @param int $mode
* @return self
*/
public
static
function
setCacheMode(
$mode
= 1)
{
$instance
= self::getInstance();
if
(
$mode
== 1)
{
$instance
->_options[
'mode'
] = 1;
}
else
{
$instance
->_options[
'mode'
] = 2;
}
return
$instance
;
}
/**
* 删除所有缓存
* @return boolean
*/
public
static
function
flush
()
{
$instance
= self::getInstance();
$glob
= @
glob
(
$instance
->_options[
'cache_dir'
] .
$instance
->_options[
'file_name_prefix'
] .
'--*'
);
if
(
empty
(
$glob
))
{
return
false;
}
foreach
(
$glob
as
$v
)
{
$fileName
=
basename
(
$v
);
$id
=
$instance
->_fileNameToId(
$fileName
);
$instance
->
delete
(
$id
);
}
return
true;
}
}
/* 初始化设置cache的配置信息什么的 */
cache::setCachePrefix(
'core'
);
//设置缓存文件前缀
cache::setCacheDir(
'./cache'
);
//设置存放缓存文件夹路径
//模式1 缓存存储方式
//a:3:{s:8:"contents";a:7:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:34;i:4;i:5;i:5;i:6;i:6;i:6;}s:6:"expire";i:0;s:5:"mtime";i:1318218422;}
//模式2 缓存存储方式
/*
<?php
// mktime: 1318224645
return array (
'contents' =>
array (
0 => 1,
1 => 2,
2 => 3,
3 => 34,
4 => 5,
5 => 6,
6 => 6,
),
'expire' => 0,
'mtime' => 1318224645,
)
?>
*
*
*/
cache::setCacheMode(
'2'
);
if
(!
$row
= cache::get(
'zj2'
))
{
$array
=
array
(1,2,3,34,5,6,6);
$row
= cache::set(
'zj2'
,
$array
);
}
// cache::flush(); 清空所有缓存
print_r(
$row
);
文件缓存class
<?php
/**
* 文件缓存类
* @author xiaojiong & 290747680@qq.com
* @date 2011-08-17
*/
class
cache
{
const
FILE_LIFE_KEY =
'FILE_LIFE_KEY'
;
const
CLEAR_ALL_KEY =
'CLEAR_ALL'
;
static
$_instance
= null;
protected
$_options
=
array
(
'cache_dir'
=>
'./cache'
,
'file_locking'
=> true,
'file_name_prefix'
=>
'cache'
,
'cache_file_umask'
=> 0777,
'file_life'
=> 100000
);
static
function
&getInstance(
$options
=
array
())
{
if
(self::
$_instance
=== null)
{
self::
$_instance
=
new
self(
$options
);
}
return
self::
$_instance
;
}
/**
* 设置参数
* @param array $options 缓存参数
* @return void
*/
static
function
&setOptions(
$options
=
array
())
{
return
self::getInstance(
$options
);
}
/**
* 构造函数
* @param array $options 缓存参数
* @return void
*/
private
function
__construct(
$options
=
array
())
{
if
(
$this
->_options[
'cache_dir'
] !== null) {
$dir
= rtrim(
$this
->_options[
'cache_dir'
],
'/'
) .
'/'
;
$this
->_options[
'cache_dir'
] =
$dir
;
if
(!
is_dir
(
$this
->_options[
'cache_dir'
])) {
mkdir
(
$this
->_options[
'cache_dir'
],0777,TRUE);
}
if
(!
is_writable
(
$this
->_options[
'cache_dir'
])) {
exit
(
'file_cache: 路径 "'
.
$this
->_options[
'cache_dir'
] .
'" 不可写'
);
}
}
else
{
exit
(
'file_cache: "options" cache_dir 不能为空 '
);
}
}
/**
* 设置缓存路径
* @param string $value
* @return void
*/
static
function
setCacheDir(
$value
)
{
$self
= & self::getInstance();
if
(!
is_dir
(
$value
)) {
exit
(
'file_cache: '
.
$value
.
' 不是一个有效路径 '
);
}
if
(!
is_writable
(
$value
)) {
exit
(
'file_cache: 路径 "'
.
$value
.
'" 不可写'
);
}
$value
= rtrim(
$this
->_options[
'cache_dir'
],
'/'
) .
'/'
;
$self
->_options[
'cache_dir'
] =
$value
;
}
/**
* 存入缓存数据
* @param array $data 放入缓存的数据
* @param string $id 缓存id(又名缓存识别码)
* @param cache_life 缓存时间
* @return boolean True if no problem
*/
static
function
save(
$data
,
$id
= null,
$cache_life
= null)
{
$self
= & self::getInstance();
if
(!
$id
) {
if
(
$self
->_id) {
$id
=
$self
->_id;
}
else
{
exit
(
'file_cache:save() id 不能为空!'
);
}
}
$time
= time();
if
(
$cache_life
) {
$data
[self::FILE_LIFE_KEY] =
$time
+
$cache_life
;
}
elseif
(
$cache_life
!= 0){
$data
[self::FILE_LIFE_KEY] =
$time
+
$self
->_options[
'file_life'
];
}
$file
=
$self
->_file(
$id
);
$data
=
"<?php\n"
.
" // mktime: "
.
$time
.
"\n"
.
" return "
.
var_export(
$data
, true).
"\n?>"
;
$res
=
$self
->_filePutContents(
$file
,
$data
);
return
$res
;
}
/**
* 得到缓存信息
*
* @param string $id 缓存id
* @return string|array 缓存数据
*/
static
function
load(
$id
)
{
$self
= & self::getInstance();
$time
= time();
//检测缓存是否存在
if
(!
$self
->test(
$id
)) {
// The cache is not hit !
return
false;
}
//全部清空识别文件
$clearFile
=
$self
->_file(self::CLEAR_ALL_KEY);
$file
=
$self
->_file(
$id
);
//判断缓存是否已被全部清除
if
(
is_file
(
$clearFile
) &&
filemtime
(
$clearFile
) >
filemtime
(
$file
))
{
return
false;
}
$data
=
$self
->_fileGetContents(
$file
);
if
(
empty
(
$data
[self::FILE_LIFE_KEY]) ||
$time
<
$data
[self::FILE_LIFE_KEY]) {
unset(
$data
[self::FILE_LIFE_KEY]);
return
$data
;
}
return
false;
}
/**
* 写入缓存文件
*
* @param string $file 缓存路径
* @param string $string 缓存信息
* @return boolean true 成功
*/
protected
function
_filePutContents(
$file
,
$string
)
{
$self
= & self::getInstance();
$result
= false;
$f
= @
fopen
(
$file
,
'ab+'
);
if
(
$f
) {
if
(
$self
->_options[
'file_locking'
]) @
flock
(
$f
, LOCK_EX);
fseek
(
$f
, 0);
ftruncate(
$f
, 0);
$tmp
= @fwrite(
$f
,
$string
);
if
(!(
$tmp
=== false)) {
$result
= true;
}
@fclose(
$f
);
}
@
chmod
(
$file
,
$self
->_options[
'cache_file_umask'
]);
return
$result
;
}
/**
* 格式化后的缓存文件路径
*
* @param string $id 缓存id
* @return string 缓存文件名(包括路径)
*/
protected
function
_file(
$id
)
{
$self
= & self::getInstance();
$fileName
=
$self
->_idToFileName(
$id
);
return
$self
->_options[
'cache_dir'
] .
$fileName
;
}
/**
* 格式化后的缓存文件名字
*
* @param string $id 缓存id
* @return string 缓存文件名
*/
protected
function
_idToFileName(
$id
)
{
$self
= & self::getInstance();
$self
->_id =
$id
;
$prefix
=
$self
->_options[
'file_name_prefix'
];
$result
=
$prefix
.
'---'
.
$id
;
return
$result
;
}
/**
* 判断缓存是否存在
*
* @param string $id Cache id
* @return boolean True 缓存存在 False 缓存不存在
*/
static
function
test(
$id
)
{
$self
= & self::getInstance();
$file
=
$self
->_file(
$id
);
if
(!
is_file
(
$file
)) {
return
false;
}
return
true;
}
/**
* 得到缓存信息
*
* @param string $file 缓存路径
* @return string 缓存内容
*/
protected
function
_fileGetContents(
$file
)
{
if
(!
is_file
(
$file
)) {
return
false;
}
return
include
$file
;
}
/**
* 清除所有缓存
*
* @return void
*/
static
function
clear()
{
$self
= & self::getInstance();
$self
->save(
'CLEAR_ALL'
,self::CLEAR_ALL_KEY);
}
/**
* 清除一条缓存
*
* @param string cache id
* @return void
*/
static
function
del(
$id
)
{
$self
= & self::getInstance();
if
(!
$self
->test(
$id
)){
// 该缓存不存在
return
false;
}
$file
=
$self
->_file(
$id
);
return
unlink(
$file
);
}
}
存入数据
<?php
$config
=
array
(
'name'
=>
'xiaojiong'
,
'qq'
=>
'290747680'
,
'age'
=>
'20'
,
);
//第一个参数 缓存data
//第二个参数 缓存id
//第三个参数 cache_life 0 永不过期(cache::clear()清空所有除外) 默认cache_life 为option_cache_life
cache::save(
$config
,
'config'
,0);
载入数据
<?php
//只有一个参数 cache_id
$config
= cache::load(
'config'
);
清空缓存
<?php
//清空指定缓存
cache::del(
'config'
);
//清空所有缓存
cache::clear();
cache信息配置
//在执行所有cache_func前调用
$_options
=
array
(
'cache_dir'
=>
'./cache'
,
//缓存文件目录
'file_name_prefix'
=>
'cache'
,
//缓存文件前缀
'file_life'
=> 100000,
//缓存文件生命
);
cache::setOptions(
$options
);
//再执行 就会按着新配置信息执行,否则是默认信息
cache::save(
$arr
,
'arr'
);
//就是这个方法 貌似不合理 望大家指点