博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ThinkPHP 3.2.3 数据缓存与静态缓存
阅读量:5242 次
发布时间:2019-06-14

本文共 9292 字,大约阅读时间需要 30 分钟。

ThinkPHP 3.2.3 中手册中数据缓存的地址是:

静态缓存的地址是:

 

数据缓存

使用 S 方法进行数据缓存,缓存文件默认的方式是文件缓存(DATA_CACHE_TYPE = File),文件缓存默认的保存路径是 ./Application/Runtime/Temp

当使用默认的缓存方式时,不需要在配置文件中进行配置,直接在控制器中需要缓存数据的地方调用 S 方法即可:

S(缓存名,缓存值,缓存时间)

例如在 IndexController.class.php(./Application/Home/Controller/IndexController.class.php)要对首页数据进行缓存:

where(array('pid'=>0))->order('sort')->select(); $cate = M('cate')->order('sort')->select(); $bObj = M('blog'); $field = array('id','title','time'); foreach($top_cate as $key=>$val) { $cids = Category::get_children_id($cate,$val['id']); $cids[] = $val['id']; $where = array('cid'=>array('IN',$cids)); $top_cate[$key]['blog'] = $bObj->field($field)->where($where)->order('time DESC')->select(); } //缓存 S('index_list',$top_cate,3600*24);//1天,默认存储路径是 ./Application/Home/Runtime/Temp } $this->assign('top_cate',$top_cate); $this->display(); }}

此时 ./Application/Runtime/Temp 中生成了 823c3bcf17c6b7276fa8799355c4c7c8.php

View Code

 

如果要改变缓存方式,例如不再把缓存存入文件,而是存入 Memcached 中,该项目中 PHP 的 Memcached 扩展是 Memcached:

 

此时可以通过修改配置文件 ./Applicaiton/Home/Common/Conf/conf.php,添加:

'DATA_CACHE_TYPE'=>'Memcached',    'PERSISTENTID' => 'mlm_cache',//持久链接标示    'MEMCACHED_HOST' => '127.0.0.1', //可数组形式    'MEMCACHED_PORT' => '11211',//可数组形式    'MEMECACHED_WEIGHT' => 0,//权重

注:Memcached 的驱动可以在  进行下载并放到 ./ThinkPHP/Library/Think/Cache/Driver/Memcached.class.php:

options = $options; $this->options['expire'] = isset($options['expire']) ? $options['expire'] : C('DATA_CACHE_TIME'); $this->options['prefix'] = isset($options['prefix']) ? $options['prefix'] : C('DATA_CACHE_PREFIX'); $host = C('MEMCACHED_HOST') ? C('MEMCACHED_HOST') : '127.0.0.1'; $port = C('MEMCACHED_PORT') ? C('MEMCACHED_PORT') : 11211; $weight = C('MEMECACHED_WEIGHT') ? C('MEMECACHED_WEIGHT') : 1; $weight_is_arr = is_array($weight); if (is_array($host)) { if (!is_array($port)) { throw_exception('Memcached服务器IP和端口号要一一对应'); } if ($weight_is_arr && count($weight) != count($host)) { throw_exception('Memcached服务器IP和权重值要一一对应'); } foreach ($host as $key => $value) { $servers[] = array($value, $port[$key], $weight_is_arr ? $weight[$key] : $weight); } } else { if (is_array($port)) { foreach ($port as $key => $value) { $servers[] = array($host, $value, $weight_is_arr ? $weight[$key] : $weight); } } else { $servers[] = array($host, $port, $weight_is_arr ? $weight[0] : $weight); } } $this->handler = new \Memcached($persistent_id); $this->handler->addServers($servers);// $serverList = $this->handler->getServerList();// var_dump($serverList);// var_dump($this->handler->getStats());// var_dump($this->handler->getOption());// var_dump($this->handler->getVersion());// p($serverList); } /** * 读取缓存 * @access public * @param string $name 缓存变量名 * @return mixed */ public function get($name) { N('cache_read', 1); return $this->handler->get($this->options['prefix'] . $name); } /** * 读取多个元素值 * @param array $keys [要读取的元素key数组] * @return [boolean] [返回值] */ public function getMulti($keys = array()) { if (empty($keys)) return ''; N('cache_read', 1); return $this->handler->getMulti($keys); } /** * 写入缓存 * @access public * @param string $name 缓存变量名 * @param mixed $value 存储数据 * @param integer $expire 有效时间(秒) * @return boolen */ public function set($name, $value, $expire = 0) { N('cache_write', 1); if (is_null($expire)) { $expire = $this->options['expire']; } $name = $this->options['prefix'] . $name; if ($this->handler->set($name, $value, $expire)) { return true; } return false; } /** * 写入多个元素 * @param [array] $items [要写入的健/值元素数组] * @param [int] $expire [有效时间(秒)] */ public function setMulti($items, $expire = 0) { N('cache_write', 1); if (is_null($expire)) { $expire = $this->options['expire']; } $name = $this->options['prefix'] . $name; if ($this->handler->setMulti($items, $expire)) { return true; } return false; } /** * 添加一个元素,如果这个元素已经存在,则失败 * @param [string] $key [要添加元素的key] * @param [string] $value [要添加元素的值] * @param integer $expire [有效时间] * @return boolean */ public function add($key, $value, $expire = 0) { N('cache_write', 1); return $this->handler->add($key, $value, $expire); } /** * 替换已存在key下的元素,如果不存在此key则失败 * @param [string] $key [要替换的key] * @param [string] $value [要替换的值] * @param integer $expire [有效时间] * @return [boolean] */ public function replace($key, $value, $expire = 0) { N('cache_write', 1); return $this->handler->replace($key, $value, $expire); } /** * 删除缓存 * @access public * @param string $name 缓存变量名 * @return boolen */ public function rm($name) { $name = $this->options['prefix'] . $name; return $this->handler->delete($name); } /** * 清除缓存 * @access public * @return boolen */ public function clear() { return $this->handler->flush(); }}
Memcached.class.php

 

同时 ./Application/Home/Controller/IndexController.class.php 修改为:

where(array('pid'=>0))->order('sort')->select(); $cate = M('cate')->order('sort')->select(); $bObj = M('blog'); $field = array('id','title','time'); foreach($top_cate as $key=>$val) { $cids = Category::get_children_id($cate,$val['id']); $cids[] = $val['id']; $where = array('cid'=>array('IN',$cids)); $top_cate[$key]['blog'] = $bObj->field($field)->where($where)->order('time DESC')->select(); } //缓存 S('index_list',$top_cate,3600*24);//1天,默认存储路径是 ./Application/Home/Runtime/Temp } $this->assign('top_cate',$top_cate); $this->display(); }}

在服务器端开启 Memcached,刷新首页,此时 Runtime/Tmp 下不会再生成缓存文件;

通过 Telnet 客户端查看 Memcached 服务器中存储的缓存:

stats itemsSTAT items:12:number 1STAT items:12:age 216STAT items:12:evicted 0STAT items:12:evicted_nonzero 0STAT items:12:evicted_time 0STAT items:12:outofmemory 0STAT items:12:tailrepairs 0STAT items:12:reclaimed 0STAT items:12:expired_unfetched 0STAT items:12:evicted_unfetched 0STAT items:12:crawler_reclaimed 0STAT items:12:crawler_items_checked 0STAT items:12:lrutail_reflocked 0ENDstats cachedump 12 0ITEM index_list [898 b; 1456615330 s]END

(Memcache 查看列出所有key方法:)  

首页在 Memcached 中的缓存为 index_list。

 

 

静态缓存

静态缓存就类似于一些 CMS 中直接把页面静态化,在静态文件的生存周期内直接访问静态的 HTML 文件

Home 模块的静态缓存需要在配置文件 ./Application/Home/Common/Conf/config.php 中添加配置:

//开启静态缓存    'HTML_CACHE_ON'=>true,    'HTML_CACHE_RULES'=>array(                //给Show控制器的index方法生成缓存,默认的保存位置是 ./Application/Html        'show:index'=>array('{:module}_{:action}_{id}',10) //参数:缓存文件的名称,缓存生存周期(0代表永不过期)    ),

以上配置表示缓存 show 控制器的 index 方法,保存的文件名是 show_index_{id},id 表示 $_GET['id'],也就是说(show 控制器的 index 方法用于查看文章内容页,通过 URL 传递的参数 id 来访问相应 id 的文章)访问 id 为 4 的文章时会生成 show_index_4.html 文件,默认保存在 ./Applicaiton/Html 中

 

控制器 ./Application/Home/Controller/ShowController.class.php:

$id,'del'=>0); $field = array('id','title','content','time','cid'); $blog = M('blog')->field($field)->where($where)->find(); //实体转换成字符 $blog['content'] = htmlspecialchars_decode(html_entity_decode($blog['content'])); $this->blog = $blog; //面包屑,通过子分类查询所有父分类信息 $cate = M('cate')->order('sort')->select(); $this->parent = Category::get_parents($cate, $blog['cid']); $this->display(); } //点击次数不缓存 public function inc_click() { $id = (int)$_GET['id']; $where = array('id'=>$id); //click自增1 M('blog')->where($where)->setInc('click');//默认自增1 $click = M('blog')->where($where)->getField('click'); echo 'document.write('.$click.')'; }}

 

如果在该页面中有不需要缓存的内容,例如文章的点击次数,每进行一次访问,次数加 1,可以通过 js 的形式来访问相应的点击方法,例如视图文件 ./Application/Home/View/Show/index.html:

{$blog.title}

发布于:{$blog.time|date="Y年m月d日",###}
已被阅读
{$blog.content}

 

转载于:https://www.cnblogs.com/dee0912/p/5223923.html

你可能感兴趣的文章
Flask三剑客
查看>>
Hibernate-缓存
查看>>
【BZOJ4516】生成魔咒(后缀自动机)
查看>>
提高PHP性能的10条建议
查看>>
svn“Previous operation has not finished; run 'cleanup' if it was interrupted“报错的解决方法...
查看>>
熟用TableView
查看>>
Java大数——a^b + b^a
查看>>
poj 3164 最小树形图(朱刘算法)
查看>>
服务器内存泄露 , 重启后恢复问题解决方案
查看>>
android一些细节问题
查看>>
KDESVN中commit时出现containing working copy admin area is missing错误提示
查看>>
利用AOP写2PC框架(二)
查看>>
【动态规划】skiing
查看>>
java定时器的使用(Timer)
查看>>
Android实现静默安装与卸载
查看>>
ef codefirst VS里修改数据表结构后更新到数据库
查看>>
boost 同步定时器
查看>>
[ROS] Chinese MOOC || Chapter-4.4 Action
查看>>
简单的数据库操作
查看>>
解决php -v查看到版本与phpinfo()版本不一致问题
查看>>