This article describes the caching mechanism of Smarty template engine with examples. Share it with everyone for your reference, the details are as follows:
First of all, let’s talk about smarty caching and compilation. These are two different concepts. Compilation is enabled by default, while the caching mechanism needs to be turned on manually. Smarty-compiled files are still PHP files, so they are still compiled when executed. , if it involves a database, you still have to access the database, so the overhead is not small, so smart caching is needed to solve it!
1. Enable global cache
$smarty->cache_dir = "/caches/"; //缓存目录 $smarty->caching = true; //开启缓存,为flase的时侯缓存无效 $smarty->cache_lifetime = 3600; //缓存时间
2. One page uses multiple caches
For example: an article template page will generate multiple article pages, which are of course cached into many pages. It is very simple to implement. Just set the second parameter in the display() method and specify a unique identifier. The following php code:
$smarty->display('index.tpl',$_GET["article_id"]);
As above, cache an article page through the id of the article as the second parameter.
3. Reduce overhead for caching
In other words, cached pages do not need to be processed by the database, and can be judged through the is_cached() method!
if(!$smarty->is_cached('index.tpl')){ //调用数据库 } $smarty->display('index.tpl');
4. Clear cache
Generally, caching is not enabled during the development process because the output results remain unchanged during the cache time. However, enabling caching during the application process can greatly improve web performance. The method to clear the cache is as follows:
clear_all_cache();//清除所有缓存 clear_cache('index.tpl');//清除index.tpl的缓存 clear_cache('index.tpl',cache_id);//清除指定id的缓存
5. Turn off local cache
If part of a page is cached and another part does not need to be cached, you can do this. For example, to display the user's login name, you need to turn off the cache. Smarty provides the following three solutions:
(1) Part of the template using insert is not cached
Define a processing function to be used by the insert tag. The function name format is: insert_xx (array $params, object &$smarty) where xx is the name of insert. That is to say, if the function you define is insert_abc, then The method used in the template is {insert name=abc}
Parameters are passed in through $params
It can also be made into an insert plug-in. The file name is: insert.xx.php, the function is named: smarty_insert_aa($params,&$smarty), and the definition of xx is the same as above
(2)$smarty->register_block($params, &$smarty) prevents a certain block of the entire page from being cached
Define a block:
smarty_block_name($params,$content, &$smarty){return $content;} //name表示区域名
Registration block:
$smarty->register_block(name, smarty_block_name, false); //第三参数false表示该区域不被缓存
Template writing:
{name}内容 {/name}
is written as block plug-in:
Step one: Define a plug-in function: block.cacheless.php and place it in smarty’s plugins directory
The content of block.cacheless.php is as follows:
<?php function smarty_block_cacheless($param, $content, &$smarty) { return $content; } ?>
Step 2: Write programs and templates
Sample program: testCacheLess.php
<?php include(Smarty.class.php); $smarty = new Smarty; $smarty->caching=true; $smarty->cache_lifetime = 6; $smarty->display(cache.tpl); ?>
Template used: cache.tpl
已经缓存的:{$smarty.now}<br> {cacheless} 没有缓存的:{$smarty.now} {/cacheless}
Run it now and find that it doesn’t work. Both lines of content are cached
Step 3: Rewrite Smarty_Compiler.class.php(Note: This file is very important, please back it up first to restore it if necessary)
Find:
Copy code The code is as follows: $this->_plugins[block][$tag_command] = array($plugin_func, null, null, null, true);
was changed to:
if($tag_command == cacheless) $this->_plugins[block][$tag_command] = array($plugin_func, null, null, null, false); else $this->_plugins[block][$tag_command] = array($plugin_func, null, null, null, true);
You can also directly change the last parameter of the original sentence to false, which means turning off the default cache.
(3) Use register_function to prevent the plug-in from outputting from the cache
index.tpl:
<div>{current_time}{/div} index.php: function smarty_function_current_time($params, &$smarty){ return date("Y-m-d H:m:s"); } $smarty=new smarty(); $smarty->caching = true; $smarty->register_function('current_time','smarty_function_current_time',false); if(!$smarty->is_cached()){ ....... } $smarty->display('index.tpl');
Note:
Define a function, the function name format is: smarty_type_name($params, &$smarty)
type is function
name is the user-defined label name, here it is {current_time}
The two parameters are required, even if they are not used in the function, they must be written. The functions of the two parameters are the same as above.
Readers who are interested in more Smarty-related content can check out the special topics on this site: "Basic Tutorial for Getting Started with Smarty Templates", "Summary of PHP Template Technology", "Summary of PHP Database Operation Skills Based on PDO", "PHP Operations and Operators" Usage summary", "PHP network programming skills summary", "PHP basic syntax introductory tutorial", "php object-oriented programming introductory tutorial", "php string (string) usage summary", "php mysql database operation introductory tutorial" and "Summary of Common Database Operation Skills in PHP"
I hope this article will be helpful to everyone’s PHP program design based on smarty templates.