Php page cache implementation method summary _ PHP Tutorial

Source: Internet
Author: User
Summary of php page cache implementation methods. In php page cache, ob functions are mainly used, such as ob_start (), ob_end_flush (), ob_get_contents (), but more advanced caching does not use these functions, in this article, the last implementation of php page caching mainly uses ob functions, such as ob_start (), ob_end_flush (), ob_get_contents (), however, more advanced caching does not use these functions. The last implementation in this article is described. For more information, see.

Ob_start (): indicates the start mark of the page cache. the content of this function is stored in the page cache until ob_end_flush () or ob_end_clean;
Ob_get_contents (): used to obtain the content in the page cache. after obtaining the content, we can do whatever we want to do. we can filter fields and match the content ~~~ :)
Ob_end_flush (): indicates that the page cache ends. After my verification, the cached content is output to the current page, that is, the cached content can be displayed.

With these three php functions, you can implement powerful functions. If the database query volume is large, you can use cache to solve this problem.

The following is the encoding section.

1. the initialization function is generally used to set the page cache path and the cache file naming format, which can be customized according to your preferences. The ID used here is the encrypted $ _ SERVER [REQUEST_URI] parameter. The last if judgment in this function is: if the cache period is not passed, the cached file will be loaded; otherwise, the source file will be loaded.

The code is as follows:

Function page_init ()
{
$ Url = $ _ SERVER ['request _ URI ']; // suburl. this parameter is generally unique.
$ Pageid = md5 ($ url );
$ Dir = str_replace ('/', '_', substr ($ _ SERVER ['script _ name'], 1,-4 ));
// Directory naming, 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', paipd.w.pageid.'.html ');
// Such as cache/page/exp_index/cc8ef22b405566745ed21305dd248f0e.html
$ Contents = file_get_contents (PAGE_FILE); // Read

If ($ contents & substr ($ contents, 13, 10)> time () // corresponds to the custom header added to the page_cache () function
{
Echo substr ($ contents, 27 );
Exit (0 );
}
Return true;
}

2. page cache function. here we use a tip: add a header information in the content of the cached file-expiration time, therefore, you only need to compare the expiration time in the header with the current time (in the page_init () function) to determine whether the cache has expired.

The code is as follows:


Function page_cache ($ ttl = 0)
{
$ Ttl = $ ttl? $ Ttl: PAGE_TTL; // The cache time. the default value is 3600 s.
$ Contents = ob_get_contents (); // Obtain the content from the cache
$ Contents =" N ". $ contents;
// Add the 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. use the function. Note that the two functions are executed sequentially, and do not forget ob_start ()

The code is as follows:


Page_init (); // page cache initialization
Ob_start (); // enable cache

... // Code segment

Page_cache (60); // usually the last row

?>

Example 2

The following is an example to illustrate the PHP page cache technology:

The code is as follows:

$ _ Time = 10;
$ Dir = "D: php ";

Function cache_start ($ _ time, $ dir)
{
$ Cachefile = $ dir. '/'.sha1(pai_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(pai_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, which is placed between the cache_start and cache_end methods.
For ($ I = 0; $ I <5; $ I ++)
{
Echo $ I;
Sleep (1 );
}
Cache_end ($ dir );
?>

Example

Cache using generated files

The code is as follows:

Ob_start ();
/**
* @ Author he Minghui
* @ Copyright 2009-3-13
* @ Param string $ cache_folder slow folder
* @ Param int $ cache_create_time file cache time
* @ Example $ cache = new Esj_Cache ('./_ cache', 100)
* @ Example $ cache-> read_cache () read and output the cache
* @ Example $ cache-> creatre_cache () create a cache file (put it before the end of the file)
* @ Example $ cache-> list_file () returns the list of all cached files
* @ Example $ cache-> del_file () delete all cached files
*/

Class Esj_Cache {
Private $ cache_folder = null; // cacher folder
Private $ wroot_dir = null; // site directory
Private $ cacher_create_time = null; // The time when the cacher file was created.

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 (); // outputs the cached file information.
} Else
{
Echo "an error occurred while creating the cache folder! ";
Return false;
}

} Catch (Exception $ e ){
Echo $ e;
Return false;
}
}

// Test whether the cached 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 cache
Return false;
}
Return false;
}
Else
{
Return true;
}
}

// Read the cached 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;

}

}
}

// Returns the object name.
Private function get_filename ()
{
$ Filename = $ file_name = $ this-> wroot_dir. '/'. $ this-> cache_folder. '/'. md5 ($ _ SERVER ['query _ string']). ". html ";
Return $ filename;
}

// Create a 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 "failed to write cache:". $ e;
Exit ();
}
Return true;
}
}

// Retrieve 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;
}

}

?>


Evaluate (), ob_end_flush (), ob_get_contents (), but these functions are not used for more advanced caching. The last implementation in this article is...

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.