phpwind代码分析之global.php简单说明(主要学习php基础知识的应用)

global.php文件中定义了一些函数的定义和一些论坛上的最基本的判断。
一些论坛最基本的设置都可以在这个文件中体现,其中global.php中的一些变量,是读取的pm_config表中的数值,在这个表中所有的与论坛相关的设置都在其中。
下面是转载的global.php代码的部分注释:
霏凡论坛 claudedb 原创
//此文件内容为全局变量和公用函数
//定义只有运行错误和语法编译错误才会显示错误信息

error_reporting(E_ERROR | E_PARSE);
//设置php.ini中 magic_quotes_runtime 选项值为0
//若 magic_quotes_runtime 打开时,所有外部引入的数据库资料或者文件等等都会自动转为含有反斜线溢出字符的资料。
//0表示关闭此功能

set_magic_quotes_runtime(0);
//microtime() 当前 Unix 时间戳以及微秒数。本函数仅在支持 gettimeofday() 系统调用的操作系统下可用。
//如果调用时不带可选参数,本函数以 "msec sec" 的格式返回一个字符串,其中 sec 是自 Unix 纪元(0:00:00 January 1, 1970 GMT)起到现在的秒数,msec 是微秒部分。字符串的两部分都是以秒为单位返回的。
//用$t_array变量记录microtime()函数产生的msec和sec,此时$t_array代表数组

$t_array = explode(' ',microtime());
//$P_S_T记录当前时间秒数
$P_S_T = $t_array[0] + $t_array[1];
//判断__FILE__是否为空,返回路径值,并定义为D_P和R_P
//其中__FILE__文件的完整绝对路径和文件名
//D_P和R_P的区别在于,当论坛使用二级目录设置时,D_P用于分论坛,R_P用于记录总论坛目录的绝对路径
//具体参考PHPWind论坛关于二级目录方面的说明
//在没有使用这方面设置的时候这两个值相等

define('D_P',__FILE__ ? getdirname(__FILE__).'/' : './');
define('R_P',D_P);
//销毁以下变量
unset($_ENV,$HTTP_ENV_VARS,$_REQUEST,$HTTP_POST_VARS,$HTTP_GET_VARS,$HTTP_POST_FILES,$HTTP_COOKIE_VARS);
//$_SERVER 变量由 web 服务器设定或者直接与当前脚本的执行环境相关联。
//如果
服务器变量中存在HTTP_X_FORWARDED_FOR,则从中取得客户端ip,如果没有则到HTTP_CLIENT_IP中取,都没有则到REMOTE_ADDR中取
//'HTTP_CLIENT_IP','HTTP_X_FORWARDED_FOR'是代理的IP
//这些IP头消息未必能够取得到(因为不同的浏览器不同的网络设备,可能发不同的IP头消息).所以PHP就尝试把每个IP头消息判断一下,若有,则取其中的一个.
//$c_agentip记录是否为代理ip
if($_SERVER['HTTP_X_FORWARDED_FOR']){
$onlineip = $_SERVER['HTTP_X_FORWARDED_FOR'];
$c_agentip=1;
}elseif($_SERVER['HTTP_CLIENT_IP']){
$onlineip = $_SERVER['HTTP_CLIENT_IP'];
$c_agentip=1;
}else{
$onlineip = $_SERVER['REMOTE_ADDR'];
$c_agentip=0;
}
//str_replace 用指定的字符串替换在被搜索的字符串中找到的字符串;
//第一个,要搜索的字符串,第二个为替换为的字符串,第三个被搜索的字符串
//取得客户端ip值

$onlineip = substrs(str_replace("\n",'',$onlineip),16);
//返回自从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数。
$timestamp= time();
//require_once require_once() 语句在脚本执行期间包含并运行指定文件。此行为和 require() 语句类似,
//唯一区别是如果该文件中的代码已经被包含了,则不会再次包含.应该用于在脚本执行期间同一个文件有可能被
//包含超过一次的情况下,想确保它只被包含一次以避免函数重定义,变量重新赋值等问题。
//包含require/defend.php文件,如果其中有重复包含,略过

require_once(R_P.'require/defend.php');
//根据时区设置$db_cvtime取得正确的时间$timestamp
$db_cvtime != 0 && $timestamp += $db_cvtime*60;
//如果论坛运行在DEBUG模式下
if($db_debug){
//定义显示所有错误除了运行NOTICE错误
error_reporting(E_ALL ^ E_NOTICE);
}
//PHPWind论坛版本变量
$wind_version = "4.3.2";
//在线列表大小值
$db_olsize = 96;
//静态htm缓存目录名
$htm dir = 'htm_data';
//'PHP_SELF' 当前正在执行脚本的文件名,与 document root 相关
//'SCRIPT_NAME' 当前执行脚本的绝对路径名,注: 如果脚本在 CLI 中被执行,作为相对路径,例如
//file.php 或 ../file.php,$_SERVER['SCRIPT_FILENAME'] 将包含用户指定的相对路径。
//'QUERY_STRING' 查询(query)的字符串(URL 中第一个问号 ? 之后的内容)。
//如果PHP_SELF(当前正在执行脚本的文件名)为空,则设置其为SCRIPT_NAME(包含当前脚本的路径)

!$_SERVER['PHP_SELF'] && $_SERVER['PHP_SELF']=$_SERVER['SCRIPT_NAME'];
//取得请求url完整的路径保存在$REQUEST_URI变量中
$REQUEST_URI = $_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'];
//判断当前执行文件名中是否包含静态目录$db_dir,如果包含,则
if(strpos($_SERVER['PHP_SELF'],$db_dir)!==false){
//strpos 查找字符串第一次出现的位置,第一个为被查找的字符串,第二个为要查找的字符串。返回值为0,或
//者被查找的字符第一次出现的数字位置的值;
//取到静态目录前

$tmp=substr($_SERVER['PHP_SELF'],0,strpos($_SERVER['PHP_SELF'],$db_dir));
}else{
//取全部
$tmp=$_SERVER['PHP_SELF'];
}
//HTTP_HOST-当前请求的 Host: 头信息的内容
//设置论坛地址

$db_bbsurl="http://$_SERVER[HTTP_HOST]".substr($tmp,0,strrpos($tmp,'/'));
//(int) 强制类型转换为整型
//定义整型变量$fid用于记录板块id

$fid = (int)$fid;
//定义整型变量$tid用于记录帖子id
$tid = (int)$tid;
//初始化附件保存目录$attachname及js脚本路径$js_path
$attachname = $js_path = '';
//包含data/bbscache/dbset.php文件,如果其中有重复包含,略过
require_once(D_P.'data/bbscache/dbset.php');
//ob_start("ob_gzhandler");是一种压缩技术
//ob_start();仅仅启动缓冲 并没有压缩输出
//ob_start 用来 打开输出缓冲区。 当缓冲区激活时,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区。为了输出缓冲区的内容,可以使用ob_end_flush()或者使用ob_end_clean()来输出缓冲区的内容。
//是否允许GZIP 压缩输出,允许使用ob_gzhandler压缩技术,否则只启动缓冲

$db_obstart == 1 ? ob_start('ob_gzhandler') : ob_start();
//如果使用跨台固定图片链,则图片路径为$db_http值,否则使用$picpath图片保存目录
$imgpath = $db_http != 'N' ? $db_http : $picpath;
//如果使用远程附件连接设置,则附件路径为$db_attachurl,否则使用$attachname附件保存目录
$attachpath = $db_attachurl != 'N' ? $db_attachurl : $attachname;
//本地图片路径
$imgdir = R_P.$picpath;
//本地附件路径
$attachdir = R_P.$attachname;
//如果D_P和R_P不相等并且使用了跨台固定图片链,即使用了二级目录功能
if(D_P != R_P && $db_http != 'N'){
//取总站论坛地址
$R_url=substr($db_http,-1)=='/' ? substr($db_http,0,-1) : $db_http;
$R_url=substr($R_url,0,strrpos($R_url,'/'));
}else{
//总站论坛地址即全局变量$db_bbsurl中的论坛地址值
$R_url=$db_bbsurl;
}
//如果cookie中上次访问变量lastvisit值是否为空
if(GetCookie('lastvisit')){
//取cookie中的上次访问变量lastvisit值,以"\t"分割并分别赋于$c_oltime,$lastvisit,$lastpath
//$c_oltime-用户在线时间,$lastvisit-上次访问时间,$lastpath-上次访问路径

list($c_oltime,$lastvisit,$lastpath) = explode("\t",GetCookie('lastvisit'));
//判断现在和上次访问之间的时间差是否小于论坛设定的在线用户时限,如果小于,则用户此次在线时间累加相应时间数值
($onbbstime=$timestamp-$lastvisit)[/color]$db_onlinetime [color=#0000ff]&&$c_oltime+=$onbbstime;
}else{
$lastvisit=$lastpath='';
$c_oltime=0;
}
//取在线偏移cookie(在线列表文件中的偏移量)
$ol_offset = GetCookie('ol_offset');
//取风格cookie
$skinco = GetCookie('skinco');
//若刷新预防时间不等于0
if ($db_refreshtime!=0){
//$REQUEST_URI 访问此页面所需的 URI。
//如果$REQUEST_URI与上次最后访问的路径相同,且与上次访问的时间差小于论坛设定的刷新预防时间

if($REQUEST_URI==$lastpath && $onbbstime[/color]$db_refreshtime[color=#000099]){
  //如果Cookie中没有winduser即用户的记录,设置$groupid为guest即当前用户归于游客组
  !GetCookie('winduser') && $groupid='guest';
  //创始人账号设置为TRUE
  $manager=TRUE;
  //如果cookie中没有风格变量,则风格设置为论坛的默认风格
  $skin = $skinco ? $skinco : $db_defaultstyle;
  //转页面显示语言文件中refresh_limit对应键值的提示信息
  Showmsg("refresh_limit");
}
}

//引用 在 PHP 中引用意味着用不同的名字访问同一个变量内容。这并不像 C 的指针,替代的是,引用是符号
//表别名。注意在 PHP 中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字。PHP 的引用允
//许用两个变量来指向同一个内容。意思是,当这样做时: $a =& $b;这意味着 $a 和 $b 指向了
//同一个变量。注: $a 和 $b 在这里是完全相同的,这并不是 $a 指向了 $b 或者相反,而是 $a 和 $b 指向
//了同一个地方。注: 如果具有引用的数组被拷贝,其值不会解除引用。对于数组传值给函数也是如此。

$H_url =& $db_wwwurl;
$B_url =& $db_bbsurl;
//包含data/sql_config.php文件,如果其中有重复包含,略过

require_once(D_P.'data/sql_config.php');

参考博文:http://blog.sina.com.cn/s/blog_4a6155610100051c.html

另外这里还有一篇:

PHPWind 源码解析

  关于登陆机制的解析的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值