研究背景:不是很熟悉PHP语言,通过 echo输出、工作搜索等方式倒推出这个流程出来的..........
1.访问UR:http://localhost/test/test/index.php?app=public&mod=Index&act=index
通过该地址就定位到了:IndexAction----》function index-----》$this->display();---》$this->fetch-------》 return fetch($templateFile, $this->tVar, $charset, $contentType, $display);
研究发现最后一个fetch会被调用多次,第一次的入口就如上面的分析流程,至于第二次第三次的根源入口不详
其中某次调用fetch时是返回的我关注的微博数据,下面我们来倒推下这个微博数据的来源吧
2.fetch-------------》Widget-----》renderFile(倒推)
rederFile是对指定的模板和数组数据进行结合并且输出
---->FeedListWidget--->getData---->render 这是widget的子类,作用是获取微博的数据,并且加以渲染
其中 getData中$list = model('Feed')->getFollowingFeed($where,$this->limitnums,'',$var['fgid'],$max);实际上拉取到了微博内容
对应方法定义在FeedModel---getFollowingFeed
其中 $feedlist['data'] = $this->getFeeds($feed_ids);实际拉倒到了微博信息
其中$cacheList = model('Cache')->getList('fd_', $feed_ids);拉倒到了微博信息
对应在CacheModel的getList
其中$data[$k] = $this->get($_k)获取数据
其中 $data = $this->handler->get($key);// 获取缓存数据,其中的key就是Feed表中的主键
而handler:$this->handler = Cache::getInstance($type);
handler是一个Cache实例,是文件缓存的句柄(protected $type = 'FILE'; // 缓存类型,默认为文件缓存)
综合上面的流程来看,其实就是从缓存文件中读取数据,并且与相应的模板结合输出到浏览器,但是对于微博的key每次都是要从数据库读取出来的,
这样想想可以确保数据的及时变化和内容的缓存有效的结合在一起,删除内容后缓存及时得到变更,读取数据效率也得到极大的提升
那么还有一个问题值得我们思考的就是,是谁调用了FeedListWidget.render呢,经过查找,发现是被function.inc.php中的W函数调用了
那么W函数在哪里呢,看这个
typefollowing----------ssssssss啦-------------------------------hi boy-------------
templateFile:C:\wamp1\www\test/apps/public/Tpl/default/Index/index.htmltemplateCacheFile:C:\wamp1\www\test/_runtime/tplcache//public_a8bfdef57b7c8498.php
这个是第一次进入fetch中输出的一个模板文件,模板文件中有这么一句话
<!--feed list-->
<?php echo W('FeedList',array('type'=>$type,'feed_type'=>$feed_type,'feed_key'=>$feed_key,'fgid'=>t($_GET['fgid'])));?>
</div>
</div>
哈哈,原来就是在这里使用了W函数,到此我们就分析出来了微博内容是因为我们访问了那个URL ,得到模板文件,而模板文件使用了W函数,
然后进行了render调用,然后响应的Widget实例,调用fetch函数从而把其他小模板和数据集合渲染出来,看样子,我们开始的那个 模板文件相当于
这个页面的向导模板,通过这个向导,我们把各个零散的模板组织在一起从而呈现出一个页面出来
思考1:既然每次还是要读取数据库,那么如何保证数据库的性能呢?
FeedModel里查询我关注的微博首先查询我关注的用户发表的微博id,通过联合查询区查询
$table = "{$this->tablePrefix}feed AS a LEFT JOIN {$this->tablePrefix}user_follow AS b ON a.uid=b.fid AND b.uid = {$buid}";
关于这一点,我很头疼,数据量一旦过大必然会导致性能的降低,如何做好分库分表值得深思解决!
思考2:文件缓存是如何保持它的高效性能呢?如何切换到别的缓存呢?
我们可以把缓存用成memcache,然而这个cache我想也是需要切割的,那么如何有效的和数据库分库分表结合到一起呢,值得深思
案例下载:http://pan.baidu.com/s/1vz15k