gxldan
PHPCMS 整站代码分析讲解(三)[Copy to clipboard] [ - ] CODE: 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 是否为 是就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\']; //缓存中的数据 $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 掉不需要用的变量. */ if($PHPCMS[\'enablebanip\'] && ip_banned($PHP_IP)) showmessage($LANG[\'administrator_banned_this_IP\']); /** $PHPCMS[\'enablebanip\'] 是什么.不用说应该知道了吧.这个就是后台里面设置是否开启过滤IP访问的功能.(因为我没用过phpcms,我是按照代码猜的,不对的请指出)从这里就看出了文本缓存也有他的作用的。 ip_banned()函数是什么呢.上菜再说: function ip_banned($ip) { global $PHP_TIME; //前面定义过的.当前的时间 $ipbanneds = cache_read(\'banip.php\'); if(!is_array($ipbanneds)) return FALSE; foreach($ipbanneds as $v) { if($v[\'overtime\'] < $PHP_TIME) return FALSE; if($ip == $v[\'ip\'] || preg_match("/^".str_replace(\'.\', \'[.]\', $v[\'ip\'])."$/", $ip)) return TRUE; } } 里面也用到了 cache_read() 这个函数,还是读banip.php 这个文件.banip.php这个文件里面存着你在后台甚至的要过滤的IP列表. 里面的逻辑比较简单.自己消化下了.不明白跟帖问 showmessage() 函数是提示出错信息封装好的一个函数. 国家化的 $LANG[\'administrator_banned_this_IP\']这个看到了吧.这个就是读语言包里面的.这样我们就可以出好多个语言版本的程序拉. */ $TEMP = $MOD = $CHA = $CATEGORY = $CAT = array(); $ftp = $enableftp = $tags = $html = 0; /** 初始化变量.这个是好习惯我们要模仿. */ if(!isset($mod)) { $mod = \'phpcms\'; //phpcms 是默认加载的模块 } elseif($mod != \'phpcms\') { isset($MODULE[$mod]) or exit($LANG[\'module_not_exists\']); // 从缓存中读加载的模块是否开启 /** 这个写法,我十分喜欢,平时也用.   xx && dd ; xx and dd  ;与运算要同时两边都为真整个公式才为真,就是利用这个原理. ; xx || dd ; xx or dd  或运算只要一个条件满足就不会执行下一个条件而继续执行下去. 这样写是不是很酷.   */ $MOD = cache_read($mod.\'_setting.php\'); //开始加载这个模块的一些常用配置数值。 phpcms 对应的每个模块都有一个缓存配置文件。@@ 怪不得速度那么快 @include PHPCMS_ROOT.\'/languages/\'.(defined(\'IN_ADMIN\') ? $CONFIG[\'adminlanguage\'].\'/\'.$mod.\'_admin.lang.php\' : $CONFIG[\'language\'].\'/\'.$mod.\'.lang.php\'); /** 加载想对应的模块语言包. */ } if(!isset($forward)) $forward = $PHP_REFERER; //记录前一个URL地址。估计以后下面程序有需要用这个变量 $dosubmit = isset($dosubmit) ? 1 : 0; //记录是否有表单提交过.也是以后有用 $channelid = isset($channelid) ? intval($channelid) : 0; //记录当前频道的id  如果$channelid 没有 isset 那么就为 0. intval() 十分有用。数字和数字的比较加减速度会快很多。记得哦 $skindir = PHPCMS_PATH.\'templates/\'.$CONFIG[\'defaulttemplate\'].\'/skins/\'.$CONFIG[\'defaultskin\']; //加载默认phpcms皮肤 if($PHPCMS[\'enablegzip\'] && function_exists(\'ob_gzhandler\')) { ($CONFIG[\'phpcache\'] || defined(\'SHOWJS\')) ? ob_start() : ob_start(\'ob_gzhandler\'); } else { $PHPCMS[\'enablegzip\'] = 0; ob_start(); } /** $PHPCMS[\'enablegzip\']   这个变量就是存在于 phpcms_setting.php 文件里。上面已经说过了。每个模块都有相对应的模块配置缓存文件(是从数据库copy过来的信息这个变量标致 是否开启 压缩传输。 压缩传输,听名字就知道。就是把数据按照一定的算法压缩小罗。然后再传送到客户端。这样就可以在有限的带宽中传输更大的数据拉。当然速度快了不少。压缩的数据到了你的浏览器,它就自动解压缩,老版本的一些浏览器不支持解压缩哦。不过现在还有谁用很久的浏览器呢。用法很简单的:看上面就知道: 首先判断下,看客户老大们是否在后台选择了这个模块的压缩传输(如果是的话。自然的已经加载到了相对应的文本缓存文件里面拉标致:$PHPCMS[\'enablegzip\']  和 判断 回调函数 ob_gzhandler 是否开启,  ob_gzhandler 其实不算是个函数。看手册说明。 就这么简单。它只是一个专门给 ob_start() 做回调使用的一个参数函数。详细请看下手册。别偷懒哦,在程序开头ob_start(\'ob_gzhandler\')就算是开始压缩传输了;判断完了 如果为真。就继续下面的代码: ($CONFIG[\'phpcache\'] || defined(\'SHOWJS\')) ? ob_start() : ob_start(\'ob_gzhandler\'); 看代码phpcms 是这样的: 如果用户在后台开启了压缩传输。而用户又开启了 页面缓存。那么就默认不使用压缩传输了。我也不知道为什么这样设计。我测试了下。后台开启压缩传输。又同时又使用页面缓存。没发现有什么问题。@@  如果没开启压缩传输,那么我们就ob_start(); 使用session 之前必须要 ob_start() ; 而且在ob_start() 之前不能有任何的 头文件发送和输出。比如:echo header等要不会出错的哦。 */ PHPCMS 整站代码分析讲解(三)续 QUOTE: 原帖由 peixin229 于 2008-1-19 09:51 AM 发表 [url=http://bbs.phpcms.cn/redirect.php?goto=findpost&pid=241958&ptid=49270][/url] require PHPCMS_ROOT.\'/include/\'.$db_file.\'.class.php\'; // 包含数据库操作类,下章详说 require PHPCMS_ROOT.\'/include/tag.func.php\';  //遇到再说 require PHPCMS_ROOT.\'/include/extension.inc.php\'; ...  [Copy to clipboard] [ - ] CODE: $_userid = 0; $_username = \'\'; $_groupid = 3; $_arrgroupid = array(); $phpcms_auth = getcookie(\'auth\'); /** $_userid,$_username,$_groupid  这几个记录用户信息的变量初始化,不初始化危险就太大了。@@ 如果给人家$_GET一个 _userid 变量过来。那么就会把我们这个变量覆盖。但是我们如果给这几个变量一个值, 那么按照就近原则。就算你GET个变量过来。你也一样改不了我原来的变量值。大家好好自己想下。就会明白了。 getcookie() 这个自定义函数在 global.func.php文件里定义的。上菜: function getcookie($var) { global $CONFIG; $var = $CONFIG[\'cookiepre\'].$var; return isset($_COOKIE[$var]) ? $_COOKIE[$var] : FALSE; } 这个函数用来提取我们设置的cookie . $CONFIG[\'cookiepre\']  在 config.inc.php 文件里面设置,cookie 名的前缀.  函数很简单。一看就明白不说了。 */ if($phpcms_auth) { $phpcms_auth_key = md5($PHPCMS[\'authkey\'].$_SERVER[\'HTTP_USER_AGENT\']); list($_userid, $_password, $_answer) = $phpcms_auth ? explode("\t", phpcms_auth($phpcms_auth, \'DECODE\')) : array(0, \'\', \'\'); /** list() = array(); 用户大家自己试下。 意会下 phpcms_auth()  是加密和解密 函数,  因为cookie 是存在于客户端。十分危险呀。 你看连用户的密码也存在cookie 不加密能行吗。但是呢加密后又要能解密。因为用户名和用户密码我们往下操作要获取的。 这个函数存在于 global.func.php 文件里面。大家想了解这个算法的自己去看下吧。挺简单的。 其实就是围绕着  $phpcms_auth_key  这个变量来加密解密和discuz cookie 机制差不。 $phpcms_auth_key = md5($PHPCMS[\'authkey\'].$_SERVER[\'HTTP_USER_AGENT\']);  $PHPCMS[\'authkey\'],估计后台有个 cookie 加密值让你填,然后以这个值和 $_SERVER[\'HTTP_USER_AGENT\'](系统信息) */ $_userid = intval($_userid); if($_userid < 0) $_userid = 0; //读出的cookie 的用户id 如果是 小于 if($_userid) //如果 cookie 保存的这个uid 存在,那么开始按照这个ID来查数据库用户表 来取出用户信息 { $memberinfo = $db->get_one("SELECT username,password,groupid,arrgroupid,email,chargetype,begindate,enddate,money,point,credit,newmessages FROM ".TABLE_MEMBER." WHERE userid=$_userid LIMIT 0,1"); /** phpcms 封装好的数据库类,下篇开讲这个大家就大概看行了。  大家看下 select  sql语句。 也可以学习下。 首先最好不要使用 select * from xx  的 

分类:

技术点:

相关文章: