Describes the application of the caching technology in PHP and the caching technology in php.
PHP, a web design scripting language that has emerged in recent years. Due to its powerful and scalability, php has developed considerably in recent years. Compared with traditional asp websites, it has an absolute advantage in speed. If you want mssql to convert 60 thousand pieces of data to php, it will take 40 seconds, and asp will take less than 2 minutes. however, due to the increasing number of website data, we are eager to call data more quickly. We do not need to drop data from the database every time. We can choose from other places, such as a file, or a memory address, which is the Cache Technology of php.
In general, the purpose of caching is to put data in one place to make access faster. There is no doubt that the memory is the fastest, but can hundreds of MB of data be stored in the memory? This is not realistic. Of course, sometimes it is temporarily stored as a server cache, for example, if the ob_start () cache page is enabled, the page content will be cached in the memory before the file header is sent, knowing that the page output will be clear automatically or wait for the ob_get_contents to return, [or be cleared by the ob_end_clean display, which can be used well in static page generation and can be well reflected in the template, I have discussed this article in depth:
This is a temporary method for generating static pages in PHP, but it is not a good solution to our problem.
In addition, there is an object application in asp that can save common parameters. This is also a bit of cache. However, in php, I have not seen such an object produced by developers so far. Indeed, there is no need for .asp.net's page cache technology to use viewstate, while cache is a File Association (not necessarily accurate), the file is modified, and the cache is updated, if the file is not modified and does not Time Out (note 1), read the cache and return the result. This is the idea. Let's look at the source code:
<? Php Classcache { /* ClassName: cache Description: controltocachedata, $ cache_out_timeis1_raytosavecachedatetimeout. Version: 1.0 Author: Lao Nong cjjer Lastmodify: 2006-2-26 AuthorURL: http://www.cjjer.com */ Private $ cache_dir; Private $ expireTime = 180; // The cache time is 60 seconds. Function _ construct ($ cache_dirname ){ If (! @ Is_dir ($ cache_dirname )){ If (! @ Mkdir ($ cache _ dirname, 0777 )){ $ This-> warn (''the cache file does not exist and cannot be created.'' needs to be created manually .''); Returnfalse; } } $ This-> cache_dir = $ cache_dirname; } Function _ destruct (){ Echo ''cacheclassbye .''; } Functionget_url (){ If (! Isset ($ _ SERVER [''request _ URI '']) { $ Url = $ _ SERVER [''request _ URI '']; } Else { $ Url = $ _ SERVER [''script _ name'']; $ Url. = (! Empty ($ _ SERVER [''query _ string''])? ''? ''. $ _ SERVER [''query _ string'']: '''; } Return $ url; } Functionwarn ($ errorstring ){ Echo "<B> <fontcolor = ''red''> error: <pre>". $ errorstring. "</pre> </font> </B> "; } Functioncache_page ($ pageurl, $ pagedata ){ If (! $ Fso = fopen ($ pageurl, ''w '')){ $ This-> warns (''the cache file cannot be opened.''); // trigger_error Returnfalse; } If (! Flock ($ fso, LOCK_EX) {// LOCK_NB, locking $ This-> warns (''the cache file cannot be locked.''); // trigger_error Returnfalse; } If (! Fwrite ($ fso, $ pagedata) {// write byte stream, serialize writes to other formats $ This-> warns (''the cache file cannot be written.''); // trigger_error Returnfalse; } Flock ($ fso, LOCK_UN); // release lock Fclose ($ fso ); Returntrue; } Functiondisplay_cache ($ cacheFile ){ If (! File_exists ($ cacheFile )){ $ This-> warn (''cannot read the cached file.''); // trigger_error Returnfalse; } Echo ''read cache file: ''. $ cacheFile; // Returnunserialize (file_get_contents ($ cacheFile )); $ Fso = fopen ($ cacheFile, ''r ''); $ Data = fread ($ fso, filesize ($ cacheFile )); Fclose ($ fso ); Return $ data; } Functionreaddata(your cachefile=''default_cache.txt ''){ $ CacheFile = $ this-> cache_dir. "/". $ cacheFile; If (file_exists ($ cacheFile) & filemtime ($ cacheFile)> (time ()-$ this-> expireTime )){ $ Data = $ this-> display_cache ($ cacheFile ); } Else { $ Data = "fromherewocangetitfrommysqldatabase, updatetimeis <B> ". date (''ldsoffyh: I: sa ''). "</B>. The expiration time is :". date (''ldsoffyh: I: sa'', time () + $ this-> expireTime ). "----------"; $ This-> cache_page ($ cacheFile, $ data ); } Return $ data; } } ?> |
Next I will interrupt this code and explain it line by line.
3. Procedural dialysis
This cache class is named cache and has two attributes:
Private $ cache_dir; Private $ expireTime = 180; |
$ Cache_dir is the parent directory of the relative website directory of the cache file. $ expireTime (Note 1) is the time when the cached data expires. The main idea is as follows:
When the data or file is loaded, the system first determines whether the cached file exists or does not, and returns false. The last modification time and cache time of the file are not greater than the current time, if the cache size is large, it indicates that the cache has not expired. If it is small, false is returned. When false is returned, raw data is read, written to the cache file, and data is returned .,
Next let's look at the program:
Function _ construct ($ cache_dirname ){ If (! @ Is_dir ($ cache_dirname )){ If (! @ Mkdir ($ cache _ dirname, 0777 )){ $ This-> warn (''the cache file does not exist and cannot be created.'' needs to be created manually .''); Returnfalse; } } $ This-> cache_dir = $ cache_dirname; } |
When the class is started for the first time, construct the default function with the parameter cache file name. If the file does not exist, create a folder with the editing permission and throw an exception when the creation fails. set the $ cache_dir attribute of the cache class to the folder name. All the cached files are under this folder.
Function _ destruct (){ Echo ''cacheclassbye .''; } |
This is a class destructor. To demonstrate this, We output a string to indicate that we have successfully released the cache class resources.
Functionwarn ($ errorstring ){ Echo "<B> <fontcolor = ''red''> error: <pre>". $ errorstring. "</pre> </font> </B> "; } |
This method outputs an error message.
Functionget_url (){ If (! Isset ($ _ SERVER [''request _ URI '']) { $ Url = $ _ SERVER [''request _ URI '']; } Else { $ Url = $ _ SERVER [''script _ name'']; $ Url. = (! Empty ($ _ SERVER [''query _ string''])? ''? ''. $ _ SERVER [''query _ string'']: '''; } Return $ url; } |
This method returns the information of the current url. This is what I see many foreign cms systems do, mainly cache x. php? Page = 1, x. php? Page = 2. For such files, the cache class functions are listed here to be extended.
Functioncache_page ($ pageurl, $ pagedata ){ If (! $ Fso = fopen ($ pageurl, ''w '')){ $ This-> warns (''the cache file cannot be opened.''); // trigger_error Returnfalse; } If (! Flock ($ fso, LOCK_EX) {// LOCK_NB, locking $ This-> warns (''the cache file cannot be locked.''); // trigger_error Returnfalse; } If (! Fwrite ($ fso, $ pagedata) {// write byte stream, serialize writes to other formats $ This-> warns (''the cache file cannot be written.''); // trigger_error Returnfalse; } Flock ($ fso, LOCK_UN); // release lock Fclose ($ fso ); Returntrue; } |
The cache_page method imports the cached file name and data respectively. This is the method for writing data to a file. First, open the file with fopen, call the handle to lock the file, and then use fwrite to write the file, finally, release the handle. An error will be thrown if any step occurs. you may see this comment
Write byte streams, serialize writes to other formats
By the way, if we want to write an array (the results can be queried by the select statement in the MySQL database) to the original type using the serialize function and unserialize.
Functiondisplay_cache ($ cacheFile ){ If (! File_exists ($ cacheFile )){ $ This-> warn (''cannot read the cached file.''); // trigger_error Returnfalse; } Echo ''read cache file: ''. $ cacheFile; // Returnunserialize (file_get_contents ($ cacheFile )); $ Fso = fopen ($ cacheFile, ''r ''); $ Data = fread ($ fso, filesize ($ cacheFile )); Fclose ($ fso ); Return $ data; } |
This is a way to read the cache by the file name. open the file and read all the files directly. If the file does not exist or cannot be read, false is returned. Of course, if you are not human, you can regenerate the cache.
Functionreaddata(your cachefile=''default_cache.txt ''){ $ CacheFile = $ this-> cache_dir. "/". $ cacheFile; If (file_exists ($ cacheFile) & filemtime ($ cacheFile)> (time ()-$ this-> expireTime )){ $ Data = $ this-> display_cache ($ cacheFile ); } Else { $ Data = "fromherewocangetitfrommysqldatabase, updatetimeis <B> ". date (''ldsoffyh: I: sa ''). "</B>. The expiration time is :". date (''ldsoffyh: I: sa'', time () + $ this-> expireTime ). "----------"; $ This-> cache_page ($ cacheFile, $ data ); } Return $ data; } |
This function is the method we call and can be written as an interface method. The input parameter determines whether the file exists or not, whether the last modification time of the file + expireTime has passed the current time (if the modification time is greater than the current time, the file has not expired). If the file does not exist or has expired, reload the original data. Here, for the sake of simplicity, the direct source is a string. You can inherit a class of cache class and obtain the database data. (note 2)
Iv. Supplementary explanation and conclusion
Note 1: You can adjust the cache time by yourself. You can read arrays, xml files, and cache files based on the time. Please follow your instructions, it is worth mentioning that the cache time (that is, the cache key) also uses Cache control ,. this is widely used in cms systems. They put the key to be updated in the cache, making it easy to control the entire battle.
NOTE 2: php5 began to support class inheritance, which is exciting. It writes the global rest of the website into a configuration class and then writes the class (such as the class that interacts with MySQL) with the data layer ), our cache class inherits the Data Interaction Class and can easily read the database. This class is not available here, so we have time to discuss it with you.
Note that this class file is applicable to php5 and later versions. Do not use classes for other versions.
Reprinted from: http://www.aspnetjia.com