<?php
require_once(''../../sadm/func1/func1.php'');
require_once(''../../sadm/func2/func2.php'');
require_once(''../../sadm/func1/func_opt.php'');
require_once(''../../sadm/func1/func_file.php'');
////////////////////////////////////////////////////////////
//http://bbs.phpchina.com/thread-100168-1-1.html
//PHP缓存的实现
////////////////////////////////////////////////////////////
$KeyID = myReq("KeyID");
$file = ''./cache.txt'';
$sql = " SELECT KeyID,KeyMod,InfType,InfSubj FROM InfoPics ";
$sql .= " WHERE KeyMod LIKE ''Pic%'' ORDER BY LogATime DESC limit 8 ";
$res = mysql_query($sql);
while($rec=mysql_fetch_array($res)){
$a[] = $rec;
}
$out = serialize($a); //print_r($out); //echo $out;
$fp = fopen($file,"w"); // 以写权限的方式打开文件
fputs($fp,$out);
fclose($fp);
//查看sql_cache.txt文件
//这个输出是它的变量和类型的内部表现形式。假若你用mysql_fetch_array()
//函数返回数字索引的数组和一个关联的数组(这就是为什么数据看起来像是发生了两次),
//一个是数字索引,另一个是字符串索引。
//要用缓存,你需要用函数unserialize()来使数据还原成原始格式与类型。
//你可以用file_get_contents()这个函数来读取sql_cache.txt文件的内容,把它赋给一个变量。
//implode()函数用于把数组的各元素连接成一个字符串然后使用unserialize()反序列化。
$recs = unserialize(implode('''',file($file))); //现在你可以通过$records数组并且取得原始查询的数据:
foreach($recs as $id=>$row){ print $row[''InfSubj'']."<br>"; }
//注意$records是数组(一个包含了查询结果的数字索引列——每行是一个数字和一个字符串
//...真是混乱)的一排。把它们放在一块:
//检查文件是否存在并且时间戳小于设置的过期时间
//获取存储在缓存文件中的记录或者更新缓存文件
$exp = 300; // 86400=24小时(单位:秒)
if(file_exists($file)&&
filemtime($file)>(time()-$exp)){
// 取得缓存中的记录
$recs = unserialize(file_get_contents($file));
} else {
// 通过 serialize() 函数创建缓存
}
//把缓存结果存储在共享内存中以获取更快的速度
//增加一个功能随机地运行SQL查询并且检查是否输出与缓存输出一致。如果不一致,
//则更新缓存(本函数运行次数的概率可以定为1/100)。通过哈希算法(如MD5())
//可以协助判断字符串或者文件是否改变。
//增加一个管理员的功能,人工的删除这个缓存文件,以强制更新缓存
//(如file_exists()函数返回false时)。你可以用函数unlink()删除文件。
//查询结果在数组 $records 中
/*
foreach($recs as $id=>$row){ print $row[''InfSubj'']."<br>"; }
foreach($recs as $id=>$row){
if($row[''KeyID'']==$_REQUEST[''KeyID'']){
// 被选择的目录显示粗体字
print ''<B>''.$row[''InfSubj''].''</B><BR>'';
} else {
// 其它目录显示用常规字体
print $row[''InfSubj''].''<br>'';
}
} // end foreach
*/
?>