Chinaunix首页 | 论坛 | 博客
  • 博客访问: 125686
  • 博文数量: 6
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 515
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-11 03:56
文章分类

全部博文(6)

文章存档

2011年(1)

2008年(5)

我的朋友

分类:

2008-10-22 13:47:18

/**
*作者:JLin
*最近离职在宿舍打坐,闲来看看代码,注解以便以后回忆。
*这是phpcms的核心文件common.inc.php的注释,只是个人水平解析,有错请指出。
*/
$mtime = explode(' ', microtime());
$phpcms_starttime = $mtime[1] + $mtime[0];
unset($LANG, $_REQUEST, $HTTP_ENV_VARS, $HTTP_POST_VARS, $HTTP_GET_VARS, $HTTP_POST_FILES, $HTTP_COOKIE_VARS);
set_magic_quotes_runtime(0);//JL:关闭对反斜杆、单引号等的自动加“\”处理,实际上我发现默认也是关闭的。
define('IN_PHPCMS', TRUE);//JL:定义前台入口
define('PHPCMS_ROOT', str_replace("\\", '/', substr(dirname(__FILE__), 0, -8)));//JL:网站物理路径
require PHPCMS_ROOT.'/include/global.func.php';
/*//JL:以下对请求的解析处理,处理为独立变量
*/
$search_arr = array("/ union /i","/ select /i","/ update /i","/ outfile /i","/ or /i");
$replace_arr = array(' union ',' select ',' update ',' outfile ',' or ');
$_POST = strip_sql($_POST);
$_GET = strip_sql($_GET);
$_COOKIE = strip_sql($_COOKIE);
unset($search_arr, $replace_arr);
$magic_quotes_gpc = get_magic_quotes_gpc();
if(!$magic_quotes_gpc)
{
 $_POST = new_addslashes($_POST);
 $_GET = new_addslashes($_GET);
}
@extract($_POST, EXTR_OVERWRITE);
@extract($_GET, EXTR_OVERWRITE);
unset($_POST, $_GET);
/*//JL:处理结束*/
require PHPCMS_ROOT.'/config.inc.php';//JL:网站基本设置,包括数据库参数,缓存参数,语言,风格,日志等参数
require PHPCMS_ROOT.'/languages/'.$CONFIG['language'].'/phpcms.lang.php';//JL:网站自定义响应语言
define('PHPCMS_PATH', $CONFIG['rootpath']);//JL:网站相对路径,在URL里用到
define('PHPCMS_CACHEDIR', $CONFIG['cachedir']);//JL:所有$CONFIG可以在config.inc.php中找到
$CONFIG['enablephplog'] ? set_error_handler('phpcms_error') : error_reporting(E_ERROR | E_WARNING | E_PARSE);//JL:错误日志的启用,自定义错误处理函数(之前调试的时候发现一个错误,在启用的状态如果出错了,会导致后面会话头部出问题)
if(function_exists('date_default_timezone_set')) date_default_timezone_set($CONFIG['timezone']);
header('Content-type: text/html; charset='.$CONFIG['charset']);
if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown'))
{
 $PHP_IP = getenv('HTTP_CLIENT_IP');
}
elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown'))
{
 $PHP_IP = getenv('HTTP_X_FORWARDED_FOR');
}
elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown'))
{
 $PHP_IP = getenv('REMOTE_ADDR');
}
elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown'))
{
 $PHP_IP = $_SERVER['REMOTE_ADDR'];
}
preg_match("/[\d\.]{7,15}/", $PHP_IP, $ipmatches);
$PHP_IP = $ipmatches[0] ? $ipmatches[0] : 'unknown';//JL:客户端IP
$PHP_TIME = time();
$PHP_SELF = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : (isset($_SERVER['SCRIPT_NAME']) ? $_SERVER['SCRIPT_NAME'] : $_SERVER['ORIG_PATH_INFO']);
$PHP_QUERYSTRING = $_SERVER['QUERY_STRING'];
$PHP_DOMAIN = $_SERVER['SERVER_NAME'];
$PHP_REFERER = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
$PHP_SCHEME = $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://';
$PHP_PORT = $_SERVER['SERVER_PORT'] == '80' ? '' : ':'.$_SERVER['SERVER_PORT'];
$PHP_SITEURL = $PHP_SCHEME.$PHP_DOMAIN.$PHP_PORT.PHPCMS_PATH;//JL:相当于主页地址
$PHP_URL = $PHP_SCHEME.$PHP_DOMAIN.$PHP_PORT.$PHP_SELF.($PHP_QUERYSTRING ? '?'.$PHP_QUERYSTRING : '');//JL:完整url
$db_file = $db_class = 'db_'.$CONFIG['database'];//JL:这里db_class是db_mysql
if(!defined('IN_ADMIN'))//JL:前台根据dbiscache判断,后台不采用数据库缓存
{
 if($CONFIG['dbiscache']) $db_file .= '_cache';//JL:如果启用cache,则引用的类将是db_mysql_cache.class.php
 if($CONFIG['phpcache'] == '2')//JL:缓冲功能的总开关,也是针对前台
 {
  $cachefileid = md5($PHP_SELF.'?'.$PHP_QUERYSTRING);
  $cachefiledir = PHPCMS_ROOT.'/data/phpcache/'.substr($cachefileid, 0, 2).'/';
  $cachefile = $cachefiledir.$cachefileid.'.html';//JL:缓存文件,还没搞清怎么生成的,
  if(file_exists($cachefile) && ($PHP_TIME < @filemtime($cachefile) + $CONFIG['phpcacheexpires']))
  {
   require $cachefile;
   exit;
  }
 }
 if($PHP_QUERYSTRING && preg_match("/^(.*)\.(htm|html|shtm|shtml)$/", $PHP_QUERYSTRING, $urlvar))//JL:解析类似:的URL
 {
  parse_str(str_replace(array('/', '-', ' '), array('&', '=', ''), $urlvar[1]));//JL:解析为独立变量,奇怪的是如何和上面的请求解析结合?
 }
}
require PHPCMS_ROOT.'/include/'.$db_file.'.class.php';
require PHPCMS_ROOT.'/include/tag.func.php';
require PHPCMS_ROOT.'/include/extension.inc.php';//JL:扩展文件
if( PHPCMS_ROOT.'/include/session_'.$CONFIG['database'].'.class.php')//JL:将会话与数据库交互的类
{
 if($CONFIG['sessionsavepath']) session_save_path($CONFIG['sessionsavepath']);//JL:会话保存路径
 session_start();
}
$db = new $db_class;
$db->connect($CONFIG['dbhost'], $CONFIG['dbuser'], $CONFIG['dbpw'], $CONFIG['dbname'], $CONFIG['pconnect']);
$db->iscache = $CONFIG['dbiscache'];
$db->expires = $CONFIG['dbexpires'];

if(!cache_read('table.php'))//JL:读取缓存目录/data/cache/table.php文件(主要是数据库表名,提供给其他cache函数用于生成相应的缓存文件如:cache_module,cache_channel)
{
 require_once PHPCMS_ROOT.'/include/cache.func.php';
    cache_all();//JL:生成所有的缓存文件
}
$CACHE = cache_read('common.php');//JL:common.php中返回四个数组分别是下面内容 (假设table.php缓存文件存在但common.php文件不存在的情况,岂不是要出错!)
$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']);
if($PHPCMS['enablebanip'] && ip_banned($PHP_IP)) showmessage($LANG['administrator_banned_this_IP']);//JL:ip_banned和showmessage在global.func.php中定义 是否禁止ip访问
$TEMP = $MOD = $CHA = $CATEGORY = $CAT = array();
$ftp = $enableftp = $tags = $html = 0;
if(!isset($mod))
{
 $mod = 'phpcms';
}
elseif($mod != 'phpcms')
{
 isset($MODULE[$mod]) or exit($LANG['module_not_exists']);
 $MOD = cache_read($mod.'_setting.php');//JL:读取模块的设置
 @include PHPCMS_ROOT.'/languages/'.(defined('IN_ADMIN') ? $CONFIG['adminlanguage'].'/'.$mod.'_admin.lang.php' : $CONFIG['language'].'/'.$mod.'.lang.php');
}
if(!isset($forward)) $forward = $PHP_REFERER;
$dosubmit = isset($dosubmit) ? 1 : 0;
$channelid = isset($channelid) ? intval($channelid) : 0;
$skindir = PHPCMS_PATH.'templates/'.$CONFIG['defaulttemplate'].'/skins/'.$CONFIG['defaultskin'];
/*//JL:如果用户在后台开启了压缩传输。而用户又开启了页面缓存。那么就默认不使用压缩传输了。*/
if($PHPCMS['enablegzip'] && function_exists('ob_gzhandler'))
{
 ($CONFIG['phpcache'] || defined('SHOWJS')) ? ob_start() : ob_start('ob_gzhandler');//JL:ob_start('ob_gzhandler')表示压缩传输
}
else
{
 $PHPCMS['enablegzip'] = 0;
 ob_start();
}
$_userid = 0;
$_username = '';
$_groupid = 3;
$_arrgroupid = array();
$phpcms_auth = getcookie('auth');
if($phpcms_auth)//JL:通过cookie方式验证用户登陆
{
 $phpcms_auth_key = md5($PHPCMS['authkey'].$_SERVER['HTTP_USER_AGENT']);//JL:密钥
 list($_userid, $_password, $_answer) = $phpcms_auth ? explode("\t", phpcms_auth($phpcms_auth, 'DECODE')) : array(0, '', '');//JL:解密函数phpcms_auth
 $_userid = intval($_userid);
 if($_userid < 0) $_userid = 0;
 if($_userid)
 {
  $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");//Jl:表名用已定义的常量代替,方便出现更改数据库表名的情况
  if($memberinfo && $memberinfo['password'] == $_password)//JL:解密后进行数据库记录对比判断
  {
   if($memberinfo['groupid'] == 2)
   {
                mkcookie('auth', '');
    showmessage($LANG['userid_banned_by_administrator']);
   }
   @extract($memberinfo, EXTR_PREFIX_ALL, '');//JL:解析为独立变量,但前面加了一个"_"的符号
   unset($memberinfo, $_password, $_answer);
   $_arrgroupid = $_arrgroupid ? array_filter(explode(',', $_arrgroupid)) : array(); //JL:没有提供 callback 函数,array_filter() 将删除参数中所有等值为 FALSE 的条目
  }
  else
  {
   mkcookie('auth', '');
  }
 }
}
if(isset($page)) $page = max(intval($page), 1);//JL:页码初始化
unset($db_class, $db_file, $phpcms_auth, $phpcms_auth_key, $memberinfo);
?>
阅读(8652) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~