In PHP page caching, the ob series of functions are mainly used, such as ob_start(), ob_end_flush(), and ob_get_contents(). However, more advanced caching does not use these functions. The last implementation of this article is mentioned. You can For reference.
ob_start(): The sign that the page cache starts. The content under this function is saved in the page cache until ob_end_flush() or ob_end_clean();
ob_get_contents(): Used to obtain the content in the page cache. Get In the future, we can process these contents however we want, filter fields, match content, etc.~~~:)
ob_end_flush(): Indicates the end of page caching. And I have verified that the cached content will be output to the current page, that is, the cached content can be displayed.
Using these three php functions, you can achieve powerful functions. If the database query volume is large, cache can be used to solve this problem.
The following is the encoding part.
1. Initialization function, usually setting the page cache path, cache file naming format, etc., which can be customized according to personal preferences. The identification ID used here is the encrypted $_SERVER[REQUEST_URI] parameter. There is an if judgment at the end of this function: if the cache period has not passed, load the cache file, otherwise load the source file.
The code is as follows | Copy code |
代码如下 | 复制代码 | 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; } | function page_init() { $url = $_SERVER['REQUEST_URI'];//Sub-url, this parameter is generally unique 代码如下 | 复制代码 |
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();//释放缓存 }
| $pageid = md5 ($url); $dir = str_replace('/','_',substr($_SERVER['SCRIPT_NAME'],1,-4)); //Directory naming method, such as exp_index if(!file_exists($pd = PAGE_PATH.$dir.'/'))@mkdir($pd,0777) or die("$pd directory creation failed"); //such as cache/page/ exp_index/ define('PAGE_FILE',$pd.$pageid.'.html'); //Such as cache/page/exp_index/cc8ef22b405566745ed21305dd248f0e.html $contents = file_get_contents(PAGE_FILE);/ /Read out if($contents && substr($contents, 13, 10) > time() )//Corresponds to the custom header added in the page_cache() function { echo substr($contents, 27); exit(0); } return true; } |
2. Page cache function, a trick is used here: add a header information - expiration time to the content of the cache file, so each time you only need to compare the expiration time in the header with the current time (in page_init( ) function) can determine whether the cache has expired.
The code is as follows | Copy code |
function page_cache($ttl = 0) { $ttl = $ttl ? $ttl : PAGE_TTL;//Cache time, default 3600s $ contents = ob_get_contents();//Get content from cache $contents = "n".$contents; //Add a custom header: expiration time = generation time + cache time file_put_contents(PAGE_FILE, $contents);//Write to the cache file ob_end_flush();//Release the cache } |
3. When using functions, please note that these two functions are executed in sequence, and don’t forget ob_start()
The code is as follows | Copy code |
代码如下 | 复制代码 | page_init();//页面缓存初始化 ob_start();//开启缓存 ...//代码段 page_cache(60);//一般是最后一行 ?>
|
page_init( ); // Page cache initialization ob_start();// Is the last line ?>
|
Example 2
The following is an example to illustrate PHP page caching technology :
代码如下 | 复制代码 |
$_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); ?> |
The code is as follows | Copy code |
$_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); //The following is the output content, Place between cache_start and cache_end methods for ($i=0;$i<5;$i++) { echo $i; sleep(1) ; } cache_end($dir); ?> |
Example
Using generated files for caching
The code is as follows 代码如下 | 复制代码 |
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; }
}
?>
| |
Copy code |
|
ob_start();
/**
* @author He Minghui
* @copyright 2009-3-13
* @param string $cache_folder cache folder
* @param int $cache_create_time file cache time
* @example $cache=new Esj_Cache('./_cache',100)
* @example $cache->read_cache() reads the cache and outputs
* @example $cache->creatre_cache () Create a cache file (put it at the end of the file)
* @example $cache->list_file() Returns a list of all cache files
* @example $cache->del_file() Delete all caches Document
*/class Esj_Cache{
private $cache_folder=null;//cacher folder
private $wroot_dir=null;//site directory
private $cacher_create_time=null;//creation of cacher file Timepublic 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();//Output cache file information
}else
{
echo "Cache folder creation failed!";
return false;
}}catch(Exception $e){
echo $e;
return false;
}
}//Test whether the cache folder exists
private function exist_folder($foler)
{
if(file_exists($this->wroot_dir."/".$foler)){
return true;
}else {
return false;
}
}//Create a new folder
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();//Output cachereturn false;
}
return false;
}
else
{
return true;
}
} //Read cache file
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 "File reading failed" ;
exit;}}
}//Return the name of the file
private function get_filename()
{
$filename=$file_name=$this->wroot_dir.'/'.$this->cache_folder.'/'.md5($_SERVER['QUERY_STRING']).".html";
return $filename;
}//Create cache file
public function create_cache()
{
$filename=self::get_filename( );
if($filename!="")
{
try{
file_put_contents($filename,ob_get_contents());
return true;
}catch (Exception $e)
{
echo "Write cache failed:".$e;
exit();
}
return true;
}
}// Get all files in the cache
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;
}//Delete all files in the cache
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;
}}?>
http://www.bkjia.com/PHPjc/444668.htmlwww.bkjia.comtruehttp: //www.bkjia.com/PHPjc/444668.htmlTechArticleThe ob series functions are mainly used in php page caching, such as ob_start(), ob_end_flush(), ob_get_contents( ), but more advanced caches do not use these functions. The last implementation of this article is...