PHPCMS整站源码分析.docx
- 文档编号:9242735
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:26
- 大小:29.40KB
PHPCMS整站源码分析.docx
《PHPCMS整站源码分析.docx》由会员分享,可在线阅读,更多相关《PHPCMS整站源码分析.docx(26页珍藏版)》请在冰豆网上搜索。
PHPCMS整站源码分析
/**
代码分析版权所有:
逆雪寒
*/
require'./include/common.inc.php';
/**
看common.inc.php核心启动文件我们已经讲解完了。
应该都明白了吧
*/
if($PHPCMS['ishtml']==1&&file_exists(PHPCMS_ROOT.'/'.$PHPCMS['index'].'.'.$PHPCMS['fileext']))
{
header('location:
'.$PHPCMS['index'].'.'.$PHPCMS['fileext']);
exit;
}
/**
phpcms允许在后台生静态和使用静态,这里就是先判断$PHPCMS['ishtml'](从文本缓存弄过来的。
应该知道了吧)是否为1就是开启了。
和这个静态的html文件是否存在。
*/
$channels=array();
$channels['article']=$channels['down']=$channels['picture']=$channels['info']=array();
foreach($CHANNELas$v)
{
$module=$v['module'];
if($v['islink']==0&&$MODULE[$module]['iscopy']==1)$channels[$module][$v['channelid']]=$v;
}
//获取频道模块的信息。
都是从缓存中取的
$head['title']=$PHPCMS['seo_title'];
$head['keywords']=$PHPCMS['seo_keywords'];
$head['description']=$PHPCMS['seo_description'];
//这个是网页的SEO(title,keywords,description)信息。
这个写好了。
网络蜘蛛会找你哦。
includetemplate('phpcms','index');
//template()函数是模板函数。
这个就是这章的主题。
往下会讲模板引擎的制作,大家都看到include了吧。
它的参数是文件地址。
那么就可以想到template()函数其实就是
//模板编译后的PHP文件地址。
phpcache();
/**
这个函数厉害了。
用来自动生缓存页的(这个是页面缓存和数据库信息的文本缓存不是一会事),页面缓存,就是把你所看的页自动生成XX.html静态页。
请注意前面代码。
是不是有个header()跳转到静态页呀。
那静态页那里来的?
就是给这个函数弄出来的。
自动静态化了其实。
@@是不是很简单呢。
上菜先:
functionphpcache($is_js=0)
{
global$CONFIG,$cachefiledir,$cachefile;
if(!
$is_js&&$CONFIG['phpcache']!
='2')returnFALSE;
$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,26Jul200005:
00:
00GMT');告诉浏览器此页面的过期时间(用格林威治时间表示),只要是已经过去的日期即可
header('Last-Modified:
'.gmdate('D,dMYH:
i:
s').'GMT');告诉服务器本页最后修改日期。
目的就是强迫浏览器获取最新资料
header('Cache-Control:
no-cache,must-revalidate');这句session_cache_limiter('private')作用差不多。
就是用户点击后退不会出现警告页。
十分有用哦。
大家别忘了
header('Pragma:
no-cache');不缓存当前页。
其实和前一句一样意思,这句不过是为了兼容http1.0协议。
echo$contents;//输出内容。
}
首先判断。
文件当前文件不是JS问文件和后台打开了页面缓存静态化,。
然后使用了OB读写缓冲区系列函数来操作缓冲区。
ob_get_clean()函数。
十分有用。
一般我们做整站静态化也是利用OB系列函数来实现。
这个函数就是获取当前缓冲区的HTML内容。
然后把将要输出的缓冲区内容清除掉。
网页先是一点点读到浏览器的缓冲区。
当缓冲区满了以后才会放出来。
所以我们
可以用OB系列函数在缓冲区没有输出之前截取内容来做我们要做的过滤等动作。
(dz的伪静态有部分就这样实现的。
把缓冲区中的所有超级连接地址更改成:
thread-46695-1-3.html形式。
然后apache那边再用.hataccess来做判断跳转)这里也是。
我们获取将要输出的内容以后调用strip_js()这个函数来过滤HTML内容。
因为比较简单继续上菜:
functionstrip_js($string,$js=1)
{
$string=str_replace(array("\n","\r","\""),array('','',"[url=]\\\""),$string[/url]);
return$js==1?
"document.write(\"".$string."\");\n":
$string;
}
主要是来过滤内容里面的\n换行、\r换页符和'\'具体请XX:
制表符
继续我们上个函数strip_js过滤完内容后。
在使用file_put_contents()函数把内容写到文件里面去。
也就是那个HTML静态页,恩完成了。
当前页的静态页已经存在了。
但好象不对是吧。
因为你刚用了ob_get_clean()函数。
截取内容后清空了输出的内容。
那就是浏览器成了空白页了。
所以我们要手动的来echo输出内容给客户看。
echo前呢
还有些东西要做就是header几个http协议头过去注释已经给出。
详细的XX:
http协议,会有详细的参数说明。
其主要目的是:
强制用户每次访问这个页面时获取最新资料,而不是使用存在客户端的缓存。
*/
?
>
关于phpcmscache原理,探讨
phpcms二次开发QQ:
267014881长沙php交流
软件版本:
phpcms2008 Linux王国 转载请注明原处
a.页面缓存,在后台网站配置-》性能优化中,配置了启用PHP页面缓存
if(CACHE_PAGE&&!
defined('IN_ADMIN'))cache_page_start();//看是否调用页面缓存
global.func.php有如下函数
functioncache_page_start()
{
define('CACHE_PAGE_ID',md5(RELATE_URL));
//定义cache文件的id,其中RELATE_URL在,common.inc.php中
//define('RELATE_URL',isset($_SERVER['REQUEST_URI'])?
$_SERVER['REQUEST_URI']:
SCRIPT_NAME.(QUERY_STRING?
'?
'.QUERY_STRING:
PATH_INFO));
//把本身的url+它get后的参数,两者md5加密,用来查找和生成cache-id
define('CACHE_PAGE_DIR',CACHE_PAGE_PATH.substr(CACHE_PAGE_ID,0,2).'/');
////页面缓存配置(config.inc.php)
//define('CACHE_PAGE',0);//是否开启PHP页面自动缓存功能
//define('CACHE_PAGE_PATH',PHPCMS_ROOT.'data/cache_page/');//缓存存储路径
//define('CACHE_PAGE_TTL',3600);//秒,缓存默认生命周期
//define('CACHE_PAGE_INDEX_TTL',300);//秒,缓存默认生命周期
//define('CACHE_PAGE_CATEGORY_TTL',600);//秒,缓存默认生命周期
//define('CACHE_PAGE_LIST_TTL',900);//秒,缓存默认生命周期
/define('CACHE_PAGE_CONTENT_TTL',14400);//秒,缓存默认生命周期
//PHPCMS_ROOT.'data/cache_page/+cacheid的前三位
define('CACHE_PAGE_FILE',CACHE_PAGE_DIR.CACHE_PAGE_ID.'.html');//加载cache文件
$contents=@file_get_contents(CACHE_PAGE_FILE);
if($contents&&intval(substr($contents,15,25))>TIME)//判断是否过期,如果没有,就输出文件29个字符以后的所有文件
{
echosubstr($contents,29);
exit;
}
returntrue;
}
//生成cahe文件
functioncache_page($ttl=CACHE_PAGE_TTL,$isjs=0)
{
if($ttl==0||!
defined('CACHE_PAGE_FILE'))returnfalse;
$contents=ob_get_contents();
if($isjs)$contents=format_js($contents); //读入数据,格式化js
dir_create(CACHE_PAGE_DIR);
$contents="
--expiretime:
".(TIME+$ttl)."-->\n".$contents;//加上时间和超时时间,以到后面取的时候好对比
file_put_contents(CACHE_PAGE_FILE,$contents); //写入文件
@chmod(CACHE_PAGE_FILE,0777);
}
//清除所有的cache文件,也是data/cache_page下的文件
functioncache_page_clear()
{
@set_time_limit(600);
$dirs=glob(CACHE_PAGE_PATH.'*');
foreach($dirsas$dir)
{
$files=glob($dir.'/*');
foreach($filesas$file)
{
@unlink($file);
}
@rmdir($dir);
}
}
//统计cache的更新时间和并写到数据库,比如更新时间,更新了多少次
//$M=$TEMP=array();
functioncache_count($sql)
{
global$db,$TEMP;
$id=md5($sql);
if(!
isset($TEMP['count'][$id]))
{
if(CACHE_COUNT_TTL)
{
$r=$db->get_one("SELECT`count`,`updatetime`FROM`".DB_PRE."cache_count`WHERE`id`='$id'");
if(!
$r||$r['updatetime'] { $r=$db->get_one($sql); $TEMP['count'][$id]=$r['count']; $db->query("REPLACEINTO`".DB_PRE."cache_count`(`id`,`count`,`updatetime`)VALUES('$id','".$r['count']."','".TIME."')"); } } else { $r=$db->get_one($sql); } $TEMP['count'][$id]=$r['count']; } return$TEMP['count'][$id]; } //用户信息的cache文件,现在我还不知道什么意思 functioncache_member() { global$db; $status=$db->table_status(DB_PRE.'member_cache'); if($status['Rows']==0) { @set_time_limit(600); $db->query("INSERTINTO`".DB_PRE."member_cache`SELECT*FROM`".DB_PRE."member`"); returntrue; } returnfalse; } //------------------------ //以上这些是页面cache的部分函数,其实也就是文本cache的一种方式,不过这个要在后台设置开启才行 //phpcms2008默认是不开启,如上开关的, //下面来介绍phpcms2008默认的文件cahce模式 b.文件cahce //在global.ini.php中发现如下函数 //它的cache文件的目录是daba/cahce/下的很多x.php的文件,这些文件你可以打开看一下发现是一些生成好的数组文件 //平时在后台,点更新首页,其实也就是更新了这些变量,其中用到的var_export()这个php默认函数,大家可以看一下手册 functioncache_read($file,$path='',$iscachevar=0) { if(! $path)$path=CACHE_PATH; $cachefile=$path.$file; if($iscachevar) //判断是否cache变量 { global$TEMP; //temp是全局性的临时变量,记录一些用户信息及配置信息,在commom.ini.php中有定义, $key='cache_'.substr($file,0,-4); //去掉文件的后四位作为key,这个后四位暂时我也不明白,等后面分析 returnisset($TEMP[$key])? $TEMP[$key]: $TEMP[$key]=@include$cachefile; } return@include$cachefile; } //生成cache文件 functioncache_write($file,$array,$path='') { if(! is_array($array))returnfalse; $array=" php\nreturn".var_export($array,true).";\n? >"; $cachefile=($path? $path: CACHE_PATH).$file; $strlen=file_put_contents($cachefile,$array); @chmod($cachefile,0777); return$strlen; } //删除cache文件 functioncache_delete($file,$path='') { $cachefile=($path? $path: CACHE_PATH).$file; return@unlink($cachefile); } 这只是文本cache的部分东西 全部函数在cache.func.php 介强一下这个函数,大至过程就是通过数据库调用数据,生成变量,变量写入文件,文件在调用时被引入到模板文件 functioncache_all() { @set_time_limit(600); cache_common(); cache_module(); cache_model(); cache_category(); cache_area(); cache_type(); cache_member_group(); cache_role(); cache_author(); cache_keyword(); cache_copyfrom(); cache_pos(); cache_status(); cache_workflow(); tags_update(); returnTRUE; } php /** mysql数据库类。 写得比较简单。 也没什么好说的。 大家自己看下理解下。 然后就可以跳过了。 */ defined('IN_PHPCMS') or exit('Access Denied'); /** 这个东西是不是很熟呀。 对了。 在上一章已经讲过了。 也已经在上一章的common.inc.php 启动文件里面定义了 IN_PHPCMS 所以在以下的PHP文件里都检测下是否是人为”跳墙“进来的。 是就中断 */ /** * Mysql 数据库类,支持Cache功能 */ class db_mysql { /** * MySQL 连接标识 * @var resource */ var $connid; /** * 整型变量用来计算被执行的sql语句数量 * @var int */ var $querynum = 0; /** * 数据库连接,返回数据库连接标识符 * @param string 数据库服务器主机 * @param string 数据库服务器帐号 * @param string 数据库服务器密码 * @param string 数据库名 * @param bool 是否保持持续连接,1为持续连接,0为非持续连接 * @return link_identifier */ function connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect = 0) { global $CONFIG; $func = $pconnect == 1 ? 'mysql_pconnect' : 'mysql_connect'; /** mysql_pconnect() 为常连接。 它和mysql_connect 的区别是 前者在多进程的WEB服务器上效率比较好。 但也有瑕疵就是在有关事务和数据表锁方面。 详情请查看自己的手册。 */ if(! $this->connid = @$func($dbhost, $dbuser, $dbpw)) { $this->halt('Can not connect to MySQL server'); } // 当mysql版本为4.1以上时,启用数据库字符集设置 if($this->version() > '4.1' && $CONFIG['dbcharset']) { mysql_query("SET NAMES '".$CONFIG['dbcharset']."'" , $this->connid); } // 当mysql版本为5.0以上时,设置sql mode,mysql5数据库带了字符集模式。 设置下就好 if($this->version() > '5.0') { mysql_query("SET sql_mode=''" , $this->connid); } if($dbname) { if([email=! @mysql_select_db($dbname]! @mysql_select_db($dbname[/email] , $this->connid)) { $this->halt('Cannot use database '.$dbname); } } return $this->connid; } /** * 选择数据库 * @param string 数据库名 */ function select_db($dbname) { return mysql_select_db($dbname , $this->connid); } /** * 执行sql语句 * @param string sql语句 * @param string 默认为空,可选值为 CACHE UNBUFFERED * @param int Cache以秒为单位的生命周期 * @return resource */ function query($sql , $type = '' , $expires = 3600, $dbname = '') { $func = $type == 'UNBUFFERED' ? 'mysql_unbuffered_query' : 'mysql_query'; /** mysql_unbuffered_query 效率更好。 节省内存 看手册 */ if(! ($query = $func($sql , $this->connid)) && $type ! = 'SILENT') { $this->halt('MySQL Query Error', $sql); } $this->querynum++; return $query; } /** * 执行sql语句,只得到一条记录 * @param string sql语句 * @param string 默认为空,可选值为 CACHE UNBUFFERED * @param int Cache以秒为单位的生命周期 * @return array */ function get_one($sql, $type = '', $expires = 3600, $dbname = '') { $query =
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PHPCMS 源码 分析