phpcms 源码分析六:index文件
这次是逆雪寒对index.php的分析:
/*
[/php] [ 本帖最后由 逆雪寒 于 2007-12-25 16:12 编辑 ] 尽量每天都有新的东西每天都能进一小步 现在开始讲 index.php 首页文件. 基本来说PHPCMS的加载到显示操作的整个流程都分析完了.
大家看一遍后.还要整体的来看来分析.慢慢体会.把些好的思想和思路实现到自己以后的项目里.
我相信大家都会变得很强的. 记得: 程序是死的,人是活的.有实现思路一切都好办了. [php]
<?php
/*
代码分析版权所有:逆雪寒
*/ /*
看 common.inc.php 核心启动文件我们已经讲解完了。应该都明白了吧
*/
require './include/common.inc.php'; /*
phpcms 允许在后台生静态和使用静态,这里就是先判断 $PHPCMS['ishtml']
(从文本缓存弄过来的。应该知道了吧)是否为1 就是开启了。和这个 静态的html文件是否存在。
*/
if($PHPCMS['ishtml'] == 1 && file_exists(PHPCMS_ROOT.'/'.$PHPCMS['index'].'.'.$PHPCMS['fileext']))
{
header('location:'.$PHPCMS['index'].'.'.$PHPCMS['fileext']); exit;
} $channels = array(); $channels['article'] = $channels['down']
= $channels['picture']
= $channels['info']
= array(); // 获取频道模块的信息。都是从缓存中取的
foreach($CHANNEL as $v)
{
$module = $v['module']; if($v['islink'] == 0 && $MODULE[$module]['iscopy'] == 1)
{
$channels[$module][$v['channelid']] = $v;
}
} // 这个是网页的SEO (title,keywords,description)信息。这个写好了。网络蜘蛛会找你哦。
$head['title'] = $PHPCMS['seo_title']; $head['keywords'] = $PHPCMS['seo_keywords']; $head['description'] = $PHPCMS['seo_description']; /*
* template() 函数是模板函数。这个就是这章的主题。往下会讲模板引擎的制作,大家都看到include 了吧。
* 它的参数是文件地址。那么就可以想到 template()函数其实就是模板编译后的PHP文件地址。
*/
include template('phpcms', 'index'); /*
这个函数厉害了。用来自动生缓存页的(这个是页面缓存和数据库信息的文本缓存不是一回事),页面缓存,
就是把你所看的页自动生成 XX.html 静态页。请注意前面代码。是不是有个 header()跳转到静态页呀。
那静态页那里来的?就是给这个函数弄出来的。自动静态化了其实。@@是不是很简单呢。上菜先:
*/
/*
首先判断。文件当前文件不是JS问文件和后台打开了页面缓存静态化,。然后使用了OB读写缓冲区系列函数来操作缓冲区。
ob_get_clean() 函数。十分有用。一般我们做整站静态化也是利用OB系列函数来实现。
这个函数就是获取当前缓冲区的HTML内容。然后把将要输出的缓冲区内容清除掉。网页先是一点点读到浏览器的缓冲区。
当缓冲区满了以后才会放出来。所以我们
可以用OB系列函数在缓冲区没有输出之前截取内容来做我们要做的过滤等动作。(dz的伪静态有部分就这样实现的。
把缓冲区中的所有超级连接地址更改成:thread-46695-1-3.html 形式。然后apache 那边再用.hataccess 来做判断跳转)
这里也是。我们获取将要输出的内容以后 调用 strip_js() 这个函数来过滤HTML内容。 因为比较简单继续上菜:
*/
function phpcache($is_js = 0)
{
global $CONFIG, $cachefiledir, $cachefile; if(!$is_js && $CONFIG['phpcache'] != '2') {
return FALSE;
} $contents = ob_get_clean(); if($is_js) {
$contents = strip_js($contents);
} if($CONFIG['phpcache'] == '2' && $cachefiledir && $cachefile)
{
dir_create($cachefiledir);
file_put_contents($cachefile, $contents);
@chmod($cachefile, 0777);
} // 告诉浏览器此页面的过期时间(用格林威治时间表示),只要是已经过去的日期即可
header('Expires: Mon, 26 Jul 2000 05:00:00 GMT'); // 告诉服务器本页最后修改日期。目的就是强迫浏览器获取最新资料
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); // 这句 session_cache_limiter('private') 作用差不多。
// 就是用户 点击后退不会出现警告页。十分有用哦。大家别忘了
header('Cache-Control: no-cache, must-revalidate'); // 不缓存当前页 。其实和前一句一样意思,这句不过是为了兼容http1.0协议。
header('Pragma: no-cache'); // 输出内容。
echo $contents;
}
phpcache(); /*
主要是来过滤内容里面的 \n 换行 、\r 换页符 和 '\' 具体请百度:制表符
继续我们上个函数strip_js过滤完内容后。 在使用 file_put_contents() 函数 把内容写到文件里面去。
也就是那个 HTML静态页,恩完成了。当前页的静态页已经存在了。
但好象不对是吧。因为你刚用了 ob_get_clean() 函数。截取内容后清空了输出的内容。
那就是浏览器成了空白页了。所以我们要手动的来 echo 输出内容给客户看。echo 前呢
还有些东西要做就是 header 几个http协议头过去 注释已经给出。详细的百度:http协议,
会有详细的参数说明 。其主要目的是:强制用户每次访问这个页面时获取最新资料,而不是使用存在客户端的缓存。
*/
function strip_js($string, $js = 1)
{
$string = str_replace(array("\n","\r","\""),array('','',"[url=]\\\""),$string[\url]);
return $js == 1
? "document.write(\"".$string."\");\n"
: $string;
} /*
phpcms 源码分析六:index文件的更多相关文章
- phpcms 源码分析五:文件缓存实现
这次是逆雪寒的文件缓存实现代码分析: /* [/php] PHPCMS的文本缓存实现: [php] <?php /* 这个文件里面全是有关生成文本缓存的函数.文本缓存是个好东西.一般的项目,我们 ...
- Yii2.0源码分析之——控制器文件分析(Controller.php)创建动作、执行动作
在Yii中,当请求一个Url的时候,首先在application中获取request信息,然后由request通过urlManager解析出route,再在Module中根据route来创建contr ...
- CodeIgniter框架——源码分析之入口文件index.php
CodeIgniter框架的入口文件主要是配置开发环境,定义目录常量,加载CI的核心类core/CodeIgniter.php. 在index.php中,CI首先做的事情就是设置PHP的错误报告, ...
- HDFS源码分析之FSImage文件内容(一)总体格式
FSImage文件是HDFS中名字节点NameNode上文件/目录元数据在特定某一时刻的持久化存储文件.它的作用不言而喻,在HA出现之前,NameNode因为各种原因宕机后,若要恢复或在其他机器上重启 ...
- ABP源码分析六:依赖注入的实现
ABP的依赖注入的实现有一个本质两个途径:1.本质上是依赖于Castle这个老牌依赖注入的框架.2.一种实现途径是通过实现IConventionalDependencyRegistrar的实例定义注入 ...
- Duilib源码分析(六)整体流程
在<Duilib源码分析(一)整体框架>.<Duilib源码分析(二)控件构造器—CDialogBuilder>以及<Duilib源码分析(三)XML解析器—CMarku ...
- Tomcat源码分析——SERVER.XML文件的加载与解析
前言 作为Java程序员,对于Tomcat的server.xml想必都不陌生.本文基于Tomcat7.0的Java源码,对server.xml文件是如何加载和解析的进行分析. 加载 server.xm ...
- Tomcat源码分析——server.xml文件的加载
前言 作为Java程序员,对于tomcat的server.xml想必都不陌生.本文基于Tomcat7.0的Java源码,对server.xml文件是如何加载的进行分析. 源码分析 Bootstrap的 ...
- motan源码分析六:客户端与服务器的通信层分析
本章将分析motan的序列化和底层通信相关部分的代码. 1.在上一章中,有一个getrefers的操作,来获取所有服务器的引用,每个服务器的引用都是由DefaultRpcReferer来创建的 pub ...
随机推荐
- Android WebView 开发详解(三)
转载请注明出处 http://blog.csdn.net/typename/article/details/40302351 powered by miechal zhao 概览 Android ...
- !!对python列表学习整理列表及数组详细介绍
1.Python的数组分三种类型:(详细见 http://blog.sina.com.cn/s/blog_6b783cbd0100q2ba.html) (1) list 普通的链表,初始化后可以通过特 ...
- EditPlus 配置 Java & C/CPP 开发环境
0.1安装EditPlus 0.2安装Java 0.3安装MinGW 0.4配置Java和MinGW环境变量 1.配置Java开发环境 1.1 Tool-->Preferences 1.2 Ja ...
- Google Chrome中的高性能网络 (三)
使用预连接优化了TCP连接管理 已经预解析到了主机名,也有了由OmniBox和Chrome Predictor提供信号,预示着用户未来的操作.为什么再进一步连接到目标主机,在用户真正发起请求前完成TC ...
- HTMLPARSER.NET 参考资料
例子1: using System;using System.IO;using Winista.Text.HtmlParser;using Winista.Text.HtmlParser.Lex;us ...
- Linux下的iwpriv(iwlist、iwconfig)的简单应用
无线网络飞速发展的今天,许多设备都提供了连接无线网络的功能. 那么Linux下的wifi到底该怎么配置.连接呢?? 开始配置之前,我们要说说iw家族.iw是linux下常用的wifi配置工具,网上有相 ...
- lightoj 1013
思路:动态规划.设dp[i][j][k]表示用第一个串的前i隔字符和第二个串的前k隔字符组成长度为i的串的个数,那么:若s1[j+1] == s2[k+1] dp[i+1][j+1][k+1] += ...
- LoadRunner脚本优化之—参数化迭代介
在LoadRunner的脚本优化时,有时发送给服务器的请求参数化时,服务器返回的内容也会和参数化的内容相对应,例如发送的请求带有查询key=123,则服务器也会返回含有123相关的内容.这时我们在使用 ...
- Eclipse 使用 Link 方式进行插件的安装
Eclipse 使用 Link 方式进行插件的安装 博客分类: Eclipse 使用 eclipseplugin插件link Eclipse 的插件安装方法一般有以下几种(以安装 SVN 插件为例说 ...
- UVALive 5135 Mining Your Own Business 双连通分量 2011final
题意:n条隧道由一些点连接而成,其中每条隧道链接两个连接点.任意两个连接点之间最多只有一条隧道.任务就是在这些连接点中,安装尽量少的太平井和逃生装置,使得不管哪个连接点倒塌,工人都能从其他太平井逃脱, ...