bljoohe 发表于 2015-05-19 13:11

3个方法解决php页面缓存

在php页面缓存首要用到的是ob系列函数,如ob_start(),ob_end_flush(),ob_get_contents(),可是更高档的缓存是不运用这些函数的,本文章终究一个完结就有讲到,我们可参考一下。
ob_start():页面缓存初步的象征,此函数一下的内容直至ob_end_flush()或许ob_end_clean()都保存在页面缓存中;
ob_get_contents():用来获取页面缓存中的内容,获取到今后呢,我们就可以想怎样处理这些内容都行了,过滤字段啦,匹配内容啦,都可以~~~ :)
ob_end_flush():标明页面缓存完毕。并且经我验证,缓存的内容将输出到其时页面上,也便是可以闪现缓存内容。
用此三个php函数,就可以完结强大的功用。假如数据库查询量较大,可以用cache来处理这个疑问。
下面是编码有些。
1.初始化函数,通常是设置页面缓存路径、缓存文件命名格局等,可按自个喜爱自定义。这儿用到的辨认ID是经加密的$_SERVER参数。这个函数中终究还有一个if区分:若未过缓存期,则加载缓存文件,否则加载源文件。
代码如下
拷贝代码
function page_init()
{   
   $url = $_SERVER['REQUEST_URI'];//子url,该参数通常是仅有的
   $pageid = md5($url);
   $dir = str_replace('/','_',substr($_SERVER['SCRIPT_NAME'],1,-4));
         //目录命名方法,如exp_index
   if(!file_exists($pd = PAGE_PATH.$dir.'/'))@mkdir($pd,0777) or die("$pd目录创建失利");
         //如cache/page/exp_index/
   define('PAGE_FILE',$pd.$pageid.'.html');
     //如cache/page/exp_index/cc8ef22b405566745ed21305dd248f0e.html
   $contents = file_get_contents(PAGE_FILE);//读出

   if($contents && substr($contents, 13, 10) > time() )//对应page_cache()函数中加上的自定义头部
   {
         echo substr($contents, 27);
         exit(0);
   }
   return true;   
}
2.页面缓存函数,这儿运用到一个诀窍:在缓存文件的内容中加上一个头部信息--过期时间,所以每次只需要对头部中的过期时间和其时时间进行对比(在page_init()函数中进行)就能区分缓存是不是过期了。
代码如下
拷贝代码

function page_cache($ttl = 0)
{   
   $ttl = $ttl ? $ttl : PAGE_TTL;//缓存时间,默许3600s
   $contents = ob_get_contents();//从缓存中获取内容
   $contents = "n".$contents;
     //加上自定义头部:过期时间=生成时间+缓存时间
   file_put_contents(PAGE_FILE, $contents);//写入缓存文件中
   ob_end_flush();//开释缓存
}
 
3.函数运用,留意这两个函数有先后履行次第,还有别忘了ob_start()
代码如下
拷贝代码

      page_init();//页面缓存初始化
      ob_start();//打开缓存      

      ...//代码段

      page_cache(60);//通常是终究一行

?>
例2
下面做个示例来说明PHP页面缓存技术:
代码如下
拷贝代码
$_time =10;
$dir="D:php";
function cache_start($_time, $dir)
{
$cachefile = $dir.'/'.sha1($_SERVER['REQUEST_URI']).'.html';
$cachetime = $_time;
ob_start();
if(file_exists($cachefile) && (time()-filemtime($cachefile) < $cachetime))
{
    include($cachefile);
    ob_end_flush();
    exit;
}
}
function cache_end($dir)
{
$cachefile = $dir.'/'.sha1($_SERVER['REQUEST_URI']).'.html';
$fp = fopen($cachefile, 'w');
fwrite($fp, ob_get_contents());
fclose($fp);
ob_end_flush();
}
cache_start($_time, $dir);
//以下是输出的内容,放在cache_start和cache_end两个方法之间
for ($i=0;$i<5;$i++)
{
echo $i;
sleep(1);
}
cache_end($dir);
?>

运用生成文件做缓存
代码如下
拷贝代码
ob_start();
/**
* @author 何名慧
* @copyright 2009-3-13
* @param string $cache_folder 缓文件夹
* @param int $cache_create_time 文件缓存时间
* @example $cache=new Esj_Cache('./_cache',100)
* @example $cache->read_cache() 读取缓存并输出
* @example $cache->creatre_cache() 创建缓存文件(放在文件未尾)
* @example $cache->list_file() 回来全部缓存文件列表
* @example $cache->del_file() 删去全部缓存文件
*/
class Esj_Cache{
private $cache_folder=null;//cacher文件夹
private $wroot_dir=null;//站点目录
private $cacher_create_time=null;//cacher文件的建立时间
public function __construct($cache_foldername,$cacher_time=100)
{
ob_start();
$this->wroot_dir=$_SERVER['DOCUMENT_ROOT'];
$this->cache_folder=$cache_foldername;
$this->cacher_create_time=$cacher_time;
}
public function read_cache()
{
try {
if(self::create_folder($this->cache_folder))
{
self::get_cache();//输出缓存文件信息
}else
{
echo "缓存文件夹创建失利!";
return false;
}
}catch(Exception $e){
echo $e;
return false;
}
}
//检验缓存文件夹是不是存在
private function exist_folder($foler)
{
if(file_exists($this->wroot_dir."/".$foler)){
return true;
}else {
return false;
}
}
//建立一个新的文件夹
private function create_folder($foler)
{
if(!self::exist_folder($foler))
{
try{
mkdir($this->wroot_dir."/".$foler,0777);
chmod($this->wroot_dir."/".$foler,0777);
return true;
}catch (Exception $e)
{
self::get_cache();//输出缓存
return false;
}
return false;
}
else
{
return true;
}
}
//读取缓存文件
private function get_cache()
{
$file_name=self::get_filename();
if (file_exists($file_name)&&((filemtime($file_name)+$this->cacher_create_time) > time()))
{
$content=file_get_contents($file_name);
if($content)
{
echo $content;
ob_end_flush();
exit;
}else
{
echo "文件读取失利";
exit;
}
}
}
//回来文件的名字
private function get_filename()
{
$filename=$file_name=$this->wroot_dir.'/'.$this->cache_folder.'/'.md5($_SERVER['QUERY_STRING']).".html";
return $filename;
}
//建立缓存文件
public function create_cache()
{
$filename=self::get_filename();
if($filename!="")
{
try{
file_put_contents($filename,ob_get_contents());
return true;
}catch (Exception $e)
{
echo "写缓存失利:".$e;
exit();
}
return true;
}
}
// 获得缓存中的全部文件
public function list_file()
{
$path=$this->cache_folder;
if ($handle = opendir($path)) {
while (false !== ($file = readdir($handle))) {
if($file!="." && $file!="..") {
$path1=$path."/".$file;
if(file_exists($path1))
{
$result[]=$file;
}
}
}
closedir($handle);
}
return $result;
}
//删去缓存中的全部文件
public function del_file()
{
$path=$this->cache_folder;
if ($handle = opendir($path)) {
while (false !== ($file = readdir($handle))) {
if($file!="." && $file!="..") {
$path1=$path."/".$file;
if(file_exists($path1))
{
unlink($path1);
}
}
}
closedir($handle);
}
return true;
}
}
?>
本文来源于来吧程序猿l8chengxuyuan.com

qq27898 发表于 2015-05-20 11:06

感谢分享,收藏研究一下{:qq23:}
页: [1]
查看完整版本: 3个方法解决php页面缓存