再有2个月就该庆祝自己参加工作3年整了,也是自己运用php3年整了,经常自省自己的技术实力:在一些方面还存在不足,所以就写了这篇博客,自己也是在网上抄的望大家不要见笑,现在很多网站都运用了缓存技术,自己在这方面还有不足的地方,前几天在工作中老大教了一点感觉受用了虽然代码不多当然很感谢他了;下面是我自己在网上找的一些实例也算是初步实际了解了缓存的机制了,博客的原文地址是:http://blog.sina.com.cn/s/blog_780d4de70100xin1.html
// 首先建立cache文件 (运行后部分代码有注释结果)
class cache {
private $dir;
private $lifetime;
private $cacheid;
private $ext;
function __construct($dir='',$lifetime='') {
if ($this->dir_isvalid($dir)) { // $dir cache/
$this->dir = $dir;
$this->lifetime = $lifetime; // 10
$this->ext = '.Php';
$this->cacheid = $this->getcacheid();
// $this->getcacheid(): cache/003d47a2f66c6d7f0f05a18243ca162c.php
}
}
private function isvalid() {
if (!file_exists($this->cacheid)) return false;
if (!(@$mtime = filemtime($this->cacheid))) return false;
if (mktime() - $mtime > $this->lifetime) return false;
return true;
}
public function write($mode=0,$content='') {
switch ($mode) { // int(0)
case 0:
$content = ob_get_contents();
/*var_dump($content);exit;
string(112) "time123hahhah:13:16:33 20th April
time3456hahha:13:16:33 20th April*/
break;
default:
break;
}
ob_end_flush(); // 冲刷出(送出)输出缓冲区内容并关闭缓冲
try {
file_put_contents($this->cacheid,$content); // 将字符串写入文件
}
catch (Exception $e) {
$this->error('写入缓存失败!请检查目录权限!');
}
}
public function load() { // 程序貌似没走到这个函数
if ($this->isvalid()) { //var_dump('111');exit;
echo "This is Cache. ";
//以下两种方式,哪种方式好?????
require_once($this->cacheid);
//echo file_get_contents($this->cacheid);
exit();
}
else { //var_dump('222');exit; ++
ob_start();
}
}
public function clean() { // 这个函数是清除缓存文件的
try {
unlink($this->cacheid); 删除 cache/003d47a2f66c6d7f0f05a18243ca162c.php缓存文件
}
catch (Exception $e) {
$this->error('清除缓存文件失败!请检查目录权限!');
}
}
private function getcacheid() {
return $this->dir.md5($this->geturl()).$this->ext;
// cache/003d47a2f66c6d7f0f05a18243ca162c.php
}
private function dir_isvalid($dir) {
if (is_dir($dir)) return true;
try {
mkdir($dir,0777); // 缓存文件不存在就mkdir
}
catch (Exception $e) {
$this->error('所设定缓存目录不存在并且创建失败!请检查目录权限!');
return false;
}
return true;
}
private function geturl() {
$url = '';
if (isset($_SERVER['REQUEST_URI'])) {
$url = $_SERVER['REQUEST_URI'];
}
else {
$url = $_SERVER['Php_SELF'];
$url .= empty($_SERVER['QUERY_STRING'])?'':'?'.$_SERVER['QUERY_STRING'];
}
return $url;
}
private function error($str) {
echo '
}
}
// 在建立 test.php文件
require_once('cache.php');
$cachedir = 'cache/'; //设定缓存目录
$cache = new Cache($cachedir,10); //省略参数即采用缺省设置, $cache = new Cache($cachedir);
if ($_GET['cacheact'] != 'rewrite') //此处为一技巧,通过xx.Php?cacheact=rewrite更新缓存,以此类推,还可以设定一些其它操作
$cache->load(); //装载缓存,缓存有效则不执行以下页面代码
//页面代码开始
echo $time = "第一个缓存字符串:".date('H:i:s jS F',time()).'
';
echo $time2 = "第二个缓存字符串:".date('H:i:s jS F',time()).'
';
echo '更新';
//页面代码结束
$cache->write(); //首次运行或缓存过期,生成缓存
//$cache->write(1,$time2); //只缓存$time部分的数据
// 在浏览器里输入http://localhost/test/ztest.php 可能会有错但不用担心
// 运行结果:
Notice: Undefined index: cacheact in D:\wamp_php\wamp\www\test\ztest.php on line 11
Strict Standards: mktime(): You should be using the time() function instead in D:\wamp_php\wamp\www\test\cache.php on line 20
第一个缓存字符串:13:51:00 20th April
第二个缓存字符串:13:51:00 20th April
更新
// 生成的缓存文件是:
cache\003d47a2f66c6d7f0f05a18243ca162c.Php
/* 第一个缓存字符串:13:31:26 20th April
第二个缓存字符串:13:31:26 20th April
更新 */
cache\834bf560e67a566ef08efa0df269894e.Php
/* 第一个缓存字符串:13:51:00 20th April
第二个缓存字符串:13:51:00 20th April
更新 */
// 这里报了两个错误 ,点击链接 更新 (http://localhost/test/ztest.php?cacheact=rewrite) ,错误是因为你没有传入参数 cacheact ,点击 更新 链接 就不会报错了;
当你更改 test.php 里的$time和$time2的内容的时候 点击 更新链接 cache\003d47a2f66c6d7f0f05a18243ca162c.Php缓存的文件内容会更新成你更改后的内容 但是 cache\834bf560e67a566ef08efa0df269894e.Php的内容却还是原来的没有被改变。
这个问题你来回答吧
// 这个函数就是自己写的那个缓存应用(thinkphp框架下写的)
public function choicedatedata($choiceTime){
$cacheName = 'laterdatedata_'.$choiceTime; // laterdatedata_2014-03-16
$ret = cache($cacheName);
if(!$ret){
$sql = "select count(0) as a from edl_login_game_log where DATE_FORMAT(CreateTime,'%Y-%m-%d') = '".$choiceTime."' and Username not in (select UserName from edl_login_game_log where DATE_FORMAT(CreateTime,'%Y-%m-%d')< '".$choiceTime."' group by UserName) group by UserName";
$ret = $this->query($sql);
cache($cacheName,$ret);
}
return $ret;
}