<?
{ //如果缓存文件存在和缓存没有过期效,那么就返回缓存文件名
require $cachefile;
exit;
}
}
if($PHP_QUERYSTRING && preg_match("/^(.*)\.(htm|html|shtm|shtml)$/", $PHP_QUERYSTRING, $urlvar)) //获取传递过来的变量。有什么用的呢?请看下面解释
{
parse_str(str_replace(array('/', '-', ' '), array('&', '=', ''), $urlvar[1]));
}
}
/**
parse_str:本函数可将浏览器返回的 GET 方法的 QUERY_STRING 字符串解析。返回的变量名及值就依 QUERY_STRING 的名称及值.
上面这部分相对复杂了点。但没关系。慢慢讲解. 首先缓存只针对前台.所以我们一开始就判断.这个脚本是运行在前台的而不是在后台 !defined('IN_ADMIN') 来判断.
然后呢.再看客户配置 config.inc.php文件是否开启了缓存. ==2 就是开启了. .接着开始用一系列的规则来找出缓存的文件名和目录: 以 脚本名:xx.php和后续传递的参数 ?xx=ee&bb=jj 他两的字符窜的MD5 .以这个md5窜来定义出了缓存目录.和缓存文件 .接着再判断这个缓存文件是否存在和是否没过缓存有效期.如果没有就返回这个缓存文件的名字.
然后到主菜了. 最后一个if逻辑是做什么的呢? 不知道大家有没见过 这样的网址:http://www.beihai.com/dd.php/xx-23/cc-22.html 他们其实都算是伪静态.优化URL用的.咋看起来还很象静态.爽. 但你可能想.这样的地址.我们写PHP程序的.怎么获取get 变量呢? 最后if 就是解答这个问题的. 先剥离url来获取 传递的字符窜.然后 str_replace 来把 '/' '-' 替换成标准的 '&' '=' 好象: http://www.beihai.com/dd.php&xx=23&cc=22 看这样你应该看明白了吧.然后用 parse_str() 函数来把xx 变 $xx=23 cc 变 $cc=22 php真是什么都给你想到了.强.看明白了吧.OK.过了.
恩.终于把common.inc.php 这个文件大概讲解完了. 这个文件里面包含了很多东西.都是些挺不错的思想.大家应该好好学习.这样我们写出来的PHP程序会更加强壮.
,偶现在晚上都在边陪老婆边看电影边弄linux 的C,还是学习 阶段 所以时间有点紧.白天在公司挤点时间出来分析代码罗.
对于phpcms 我也是第一次接触.以前没装过也没用过.现在也没详细用过.所以我看到代码讲什么我就讲什么.没具体讲PHPCMS的应用等.希望理解.
如果我分析代码分析得不合理.请指出.功能进步学习.谢谢复制PHP内容到剪贴板PHP代码: */
require PHPCMS_ROOT.'/include/'.$db_file.'.class.php'; // 包含数据库操作类,下章详说
require PHPCMS_ROOT.'/include/tag.func.php'; //遇到再说
require PHPCMS_ROOT.'/include/extension.inc.php'; //遇到再说
$db = new $db_class; // 实例化数据库类
$db->connect($CONFIG['dbhost'], $CONFIG['dbuser'], $CONFIG['dbpw'], $CONFIG['dbname'], $CONFIG['pconnect']); //连接数据库@_@
$db->iscache = $CONFIG['dbiscache']; //是否开启SQL缓存
$db->expires = $CONFIG['dbexpires']; //缓存时间
if(!cache_read('table.php'))
{
require_once PHPCMS_ROOT.'/include/cache.func.php';
cache_all(); //生成所有缓存
}
/**
cache_read() 函数 读缓存文件函数存在 global.func.php 里面.上菜先:
function cache_read($file, $mode = 'i')
{
$cachefile = PHPCMS_CACHEDIR.$file;
if(!file_exists($cachefile)) return array();
return $mode == 'i' ? include $cachefile : file_get_contents($cachefile); //这一步是用来判断是不是本站内模块,如果没有传入值的话就调用这个缓存,反之则得到他的内容。
}
就这么简单.文本缓存,在一些大的开源的PHP项目中经常见到.主要是为了减轻数据库的负荷的. 比如在程序启动文件里面,就把一些后台配置的常用信息缓存到php文件里面.然后在以后的程序就可以直接使用而不用每次都访问数据库了.但对经常要更新的信息.最好不要用文本缓存这形式,因为PHP文件内置的文件锁flock()不是很好用.大系统中多用户同时写访问的时候有可能会把缓存文件破坏.大系统建议使用 memcached mysql5.1 分区 mysql 主从 来实现负载均衡 @=@ 废话太多了. 这个函数很简单.自己看下就明白了.如果缓存和模式变量 $mode 是否为 i 是就include 不是就 把文件以字符窜形式读到内存中.
如果 cache_read()找不到缓存文件'table.php'就会返回false,那么就 加栽 cache.func.php 文件.它里面是些创建缓存的一些函数. 然后呢执行 cache_all()函数生成所有的常用信息缓存.
关于phpcms 的缓存更详细包括生成原理.打算在弄完启动文件common.inc.php 后再开篇写个详细的.
*/
$CACHE = cache_read('common.php');
/**
加载 common.php 缓存文件里面的变量(数据) 这样我们不用从数据库读了每次.是吧
common.php 文件里面是什么来的呢?上菜:
<?php
return array (
'module' =>
array (
'phpcms' =>
array (
'module' => 'phpcms',
'name' => 'phpcms',
'iscore' => '1',
'iscopy' => '0',
'isshare' => '0',
'moduledir' => '',
'linkurl' => '',
),
'member' =>
array (
'module' => 'member',
'name' => '会员',
'iscore' => '1',
'iscopy' => '0',
'isshare' => '0',
'moduledir' => 'member',
'linkurl' => '/phpcms/member/',
),
'article' =>
array (
'module' => 'article',
'name' => '文章',
'iscore' => '0',
'iscopy' => '1',
'isshare' => '0',
'moduledir' => 'article',
'linkurl' => '',
)
?>
看到了吧.这个就是全部从数据库里面生成的文本缓存信息.我们不用每次都连接数据库读数据库.而只要访问里面的数组就可以得到一些配置信息.
这个就是文本缓存的作用了,至于怎么会生成这个文本缓存文件的.我会另外开一篇来介绍。
*/
$MODULE = $CACHE['module']; //把缓存中的数据(common.php)存放到数组中。
$CHANNEL = $CACHE['channel'];
$PHPCMS = $CACHE['phpcms'];
$FIELD = $CACHE['field'];
unset($CACHE, $ipmatches, $CONFIG['timezone'], $CONFIG['cachedir'], $CONFIG['dbhost'], $CONFIG['dbuser'], $CONFIG['dbpw'], $CONFIG['pconnect'], $CONFIG['dbiscache'], $CONFIG['dbexpires']);
/**
unset 掉不需要用的变量.
*/
?>