干货分享,灵感创作,不定期更新,敬请期待。

thinkphp高级模型之延迟更新

php xhq 2087℃ 0评论

thinkphp高级模型封装了挺多方法提高服务器安全性,可维护性和缓解服务器压力,
当然也不是适用于所有场景,比如你出差要跨越100公里,当然选择车作为交通工具,但如果5分钟的路又不急走路也是很好的选择
比如就拿下面的方法说说

AdvModel.class.php(thinkphp内置类)

/**
* 字段值延迟增长
* @access public
* @param string $field 字段名
* @param integer $step 增长值
* @param integer $lazyTime 延时时间(s)
* @return boolean
*/
1    public function setLazyInc($field,$step=1,$lazyTime=0) {
2               $condition = $this->options[‘where’];
3              if(empty($condition)) {        // 没有条件不做任何更新
4                           return false;
5               }
6              if($lazyTime>0) {// 延迟写入
7                           dump($this->name);//debug
8                           dump($field,true);//debug
9                           dump($condition,true);//debug
10                         echo $guid = md5($this->name.’_’.$field.’_’.serialize($condition));
11                         $step = $this->lazyWrite($guid,$step,$lazyTime);
12                          if(false === $step ) return true; // 等待下次写入
13            }
14           return $this->setField($field,array(‘exp’,$field.’+’.$step));
15   }

以下是模型类UserModel.class.php(自定义模型),继承高级模型

1 <?php
2 namespace Home\Model;
3 use Think\Model\AdvModel;
4 class UserModel extends AdvModel{
5              public function lazy_test(){
6                            echo $this->where(array(‘uid’=>1))->setLazyInc(‘num’,2,10);//延迟时间为10秒
7                            return $this->where(array(‘uid’=>1))->select();
8              }
9 }

以下是控制器的方法

1 public function ttt(){
2              $m_user = D(‘user’);
3              $res = $m_user->lazy_test();
4              dump($res);
5 }

ok,页面输出结果如下
1 string(4) “user”
2 1 string(3) “num”
3 1 array(1) {
4 [“uid”] => int(1)
5 }
6 cb36c20a61e1587958252c0f58f4b7911
7 array(1) {
8 [0] => array(4) {
9 [“uid”] => string(1) “1”
10 [“username”] => string(10) “forevervas”
11 [“email”] => string(9) “[email protected]
12 [“num”] => string(3) “194”
13 }
14 }

  • 什么鬼?
    第六行的输出结果就是第一段代码的第10行输出,就是缓存的文件名(cb36c20a61e1587958252c0f58f4b7911.php保存数据,cb36c20a61e1587958252c0f58f4b7911_time.php保存时间),
    10秒内刷新n次,数据不会改变(这里是num字段),10秒后再刷新,数据变成num=num+n*2
    一开始我打开mysql命令行工具,先查数据,然后刷几遍,然后再mysql里查看数据,发现过了挺久
    num仍然没有改变,后来回到网页上把数据打印出来就看到数据的变换
  • 总结
    延迟更新用的不是定时任务,不是10s(这里用10s举例)执行一次,而是刷新网页时如果超过10s那么把缓存文件数据写入数据库,
    并且删除缓存文件,再次执行再次建立缓存文件(当我第一次看到延迟更新的时候,延迟n秒更新,
    还以为是执行文件,然后进入mysql任务队列(不知道mysql有没有这样的功能),然后n秒后再执行)
    还有一点值得注意,文件的缓存父目录为runtime,也就是说刷新文件缓存不要直接删除runtime文件夹,
    万一用了延迟更新呢,特别是在团队合作的时候很难把关,用了哪些文件查询缓存可以独立一个控制器写对应的删除缓存方法,还可以加上权限判断

转载请注明:爱游思 » thinkphp高级模型之延迟更新

喜欢 (2)

您必须 登录 才能发表评论!