phpcms 源码分析六:index文件
这次是逆雪寒对index.php的分析:
1 /* 2 [/php] 3 4 [ 本帖最后由 逆雪寒 于 2007-12-25 16:12 编辑 ] 5 6 7 尽量每天都有新的东西每天都能进一小步 8 9 现在开始讲 index.php 首页文件. 基本来说PHPCMS的加载到显示操作的整个流程都分析完了. 10 大家看一遍后.还要整体的来看来分析.慢慢体会.把些好的思想和思路实现到自己以后的项目里. 11 我相信大家都会变得很强的. 记得: 程序是死的,人是活的.有实现思路一切都好办了. 12 13 [php] 14 <?php 15 /* 16 代码分析版权所有:逆雪寒 17 */ 18 19 /* 20 看 common.inc.php 核心启动文件我们已经讲解完了。应该都明白了吧 21 */ 22 require './include/common.inc.php'; 23 24 /* 25 phpcms 允许在后台生静态和使用静态,这里就是先判断 $PHPCMS['ishtml'] 26 (从文本缓存弄过来的。应该知道了吧)是否为1 就是开启了。和这个 静态的html文件是否存在。 27 */ 28 if($PHPCMS['ishtml'] == 1 && file_exists(PHPCMS_ROOT.'/'.$PHPCMS['index'].'.'.$PHPCMS['fileext'])) 29 { 30 header('location:'.$PHPCMS['index'].'.'.$PHPCMS['fileext']); 31 32 exit; 33 } 34 35 $channels = array(); 36 37 $channels['article'] = $channels['down'] 38 = $channels['picture'] 39 = $channels['info'] 40 = array(); 41 42 // 获取频道模块的信息。都是从缓存中取的 43 foreach($CHANNEL as $v) 44 { 45 $module = $v['module']; 46 47 if($v['islink'] == 0 && $MODULE[$module]['iscopy'] == 1) 48 { 49 $channels[$module][$v['channelid']] = $v; 50 } 51 } 52 53 // 这个是网页的SEO (title,keywords,description)信息。这个写好了。网络蜘蛛会找你哦。 54 $head['title'] = $PHPCMS['seo_title']; 55 56 $head['keywords'] = $PHPCMS['seo_keywords']; 57 58 $head['description'] = $PHPCMS['seo_description']; 59 60 /* 61 * template() 函数是模板函数。这个就是这章的主题。往下会讲模板引擎的制作,大家都看到include 了吧。 62 * 它的参数是文件地址。那么就可以想到 template()函数其实就是模板编译后的PHP文件地址。 63 */ 64 include template('phpcms', 'index'); 65 66 /* 67 这个函数厉害了。用来自动生缓存页的(这个是页面缓存和数据库信息的文本缓存不是一回事),页面缓存, 68 就是把你所看的页自动生成 XX.html 静态页。请注意前面代码。是不是有个 header()跳转到静态页呀。 69 那静态页那里来的?就是给这个函数弄出来的。自动静态化了其实。@@是不是很简单呢。上菜先: 70 */ 71 /* 72 首先判断。文件当前文件不是JS问文件和后台打开了页面缓存静态化,。然后使用了OB读写缓冲区系列函数来操作缓冲区。 73 ob_get_clean() 函数。十分有用。一般我们做整站静态化也是利用OB系列函数来实现。 74 这个函数就是获取当前缓冲区的HTML内容。然后把将要输出的缓冲区内容清除掉。网页先是一点点读到浏览器的缓冲区。 75 当缓冲区满了以后才会放出来。所以我们 76 可以用OB系列函数在缓冲区没有输出之前截取内容来做我们要做的过滤等动作。(dz的伪静态有部分就这样实现的。 77 把缓冲区中的所有超级连接地址更改成:thread-46695-1-3.html 形式。然后apache 那边再用.hataccess 来做判断跳转) 78 这里也是。我们获取将要输出的内容以后 调用 strip_js() 这个函数来过滤HTML内容。 因为比较简单继续上菜: 79 */ 80 function phpcache($is_js = 0) 81 { 82 global $CONFIG, $cachefiledir, $cachefile; 83 84 if(!$is_js && $CONFIG['phpcache'] != '2') { 85 return FALSE; 86 } 87 88 $contents = ob_get_clean(); 89 90 if($is_js) { 91 $contents = strip_js($contents); 92 } 93 94 if($CONFIG['phpcache'] == '2' && $cachefiledir && $cachefile) 95 { 96 dir_create($cachefiledir); 97 file_put_contents($cachefile, $contents); 98 @chmod($cachefile, 0777); 99 } 100 101 // 告诉浏览器此页面的过期时间(用格林威治时间表示),只要是已经过去的日期即可 102 header('Expires: Mon, 26 Jul 2000 05:00:00 GMT'); 103 104 // 告诉服务器本页最后修改日期。目的就是强迫浏览器获取最新资料 105 header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); 106 107 // 这句 session_cache_limiter('private') 作用差不多。 108 // 就是用户 点击后退不会出现警告页。十分有用哦。大家别忘了 109 header('Cache-Control: no-cache, must-revalidate'); 110 111 // 不缓存当前页 。其实和前一句一样意思,这句不过是为了兼容http1.0协议。 112 header('Pragma: no-cache'); 113 114 // 输出内容。 115 echo $contents; 116 } 117 phpcache(); 118 119 /* 120 主要是来过滤内容里面的 \n 换行 、\r 换页符 和 '\' 具体请百度:制表符 121 继续我们上个函数strip_js过滤完内容后。 在使用 file_put_contents() 函数 把内容写到文件里面去。 122 也就是那个 HTML静态页,恩完成了。当前页的静态页已经存在了。 123 但好象不对是吧。因为你刚用了 ob_get_clean() 函数。截取内容后清空了输出的内容。 124 那就是浏览器成了空白页了。所以我们要手动的来 echo 输出内容给客户看。echo 前呢 125 还有些东西要做就是 header 几个http协议头过去 注释已经给出。详细的百度:http协议, 126 会有详细的参数说明 。其主要目的是:强制用户每次访问这个页面时获取最新资料,而不是使用存在客户端的缓存。 127 */ 128 function strip_js($string, $js = 1) 129 { 130 $string = str_replace(array("\n","\r","\""),array('','',"[url=]\\\""),$string[\url]); 131 return $js == 1 132 ? "document.write(\"".$string."\");\n" 133 : $string; 134 } 135 136 /*