phpwind 系统globalphp文件讲解.docx
《phpwind 系统globalphp文件讲解.docx》由会员分享,可在线阅读,更多相关《phpwind 系统globalphp文件讲解.docx(25页珍藏版)》请在冰豆网上搜索。
![phpwind 系统globalphp文件讲解.docx](https://file1.bdocx.com/fileroot1/2022-12/12/e7f92a51-8c54-4532-89e3-ea99639bc69a/e7f92a51-8c54-4532-89e3-ea99639bc69a1.gif)
phpwind系统globalphp文件讲解
phpwind系统global.php文件讲解
//此文件内容为全局变量和公用函数
//定义只有运行错误和语法编译错误才会显示错误信息
error_reporting(E_ERROR|E_PARSE);
//设置php.ini中magic_quotes_runtime选项值为0
//若magic_quotes_runtime打开时,所有外部引入的数据库资料或者文件等等都会自动转为含有反斜线溢出字符的资料。
//0表示关闭此功能
set_magic_quotes_runtime(0);
//microtime()当前Unix时间戳以及微秒数。
本函数仅在支持gettimeofday()系统调用的操作系统下可用。
//如果调用时不带可选参数,本函数以"msecsec"的格式返回一个字符串,其中sec是自Unix纪元(0:
00:
00January1,1970GMT)起到现在的秒数,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);
//get_magic_quotes_gpc函数取得PHP环境配置的变量magic_quotes_gpc(GPC,Get/Post/Cookie)值。
返回0表示关闭本功能;返回1表示本功能打开。
当magic_quotes_gpc打开时,所有的'(单引号),"(双引号),\(反斜线)and空字符会自动转为含有反斜线的溢出字符。
//在magic_quotes_gpc功能关闭的情况下,对$_POST、$_GET、$_COOKIE中的特殊字符转义处理
if(!
get_magic_quotes_gpc()){
//$_POST经由HTTPPOST方法提交至脚本的变量。
Add_S($_POST);
//$_GET经由URL请求提交至脚本的变量。
Add_S($_GET);
//$_FILES通过HTTPPOST方法传递的已上传文件项目组成的数组。
Add_S($_FILES);
//$_COOKIE经由HTTPCookies方法提交至脚本的变量。
Add_S($_COOKIE);
}
//$_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_oncerequire_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缓存目录名
$htmdir ='htm_data';
//'PHP_SELF'当前正在执行脚本的文件名,与documentroot相关
//'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,$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)<$db_onlinetime&&$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<$db_refreshtime){
//如果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');
//如果论坛关闭
if($db_bbsifopen==0){
//从cookie中取得AdminUser(管理人员)变量值,并对其进行解码操作后,以"\t"分割存入数组$CK中
$CK=explode("\t",StrCode(GetCookie('AdminUser'),'DECODE'));
//如果上次访问时间$CK[0]与现在相差超过1800s即30分钟
//或者账号$CK[1]不是创始人账号$manager
//或者不符合安全检测
if($timestamp-$CK[0]>1800||$CK[1]!
=$manager||!
SafeCheck($CK,PwdCode($manager_pwd))){
//取得风格值
$skin =$skinco?
$skinco:
$db_defaultstyle;
//设置用户组为空
$groupid='';
//转页面显示$db_whybbsclose信息即论坛关闭的原因
Showmsg($db_whybbsclose);
}
}
//gmdate--格式化一个GMT/UTC日期/时间
//date--格式化一个本地时间/日期,返回将整数timestamp按照给定的格式字串而产生的
//字符串。
如果没有给出时间戳则使用本地当前时间。
换句话说,timestamp是可选的,默认值为time()。
注:
//有效的时间戳典型范围是格林威治时间1901年12月13日20:
45:
54到2038年1月19日
//03:
14:
07。
(此范围符合32位有符号整数的最小值和最大值)。
不过在PHP5.1之前此范围在某些系统
//(如Windows)中限制为从1970年1月1日到2038年1月19日。
//格式字串可以识别以下format参数的字符串format字符说明返回值例子
//日------
//d月份中的第几天,有前导零的2位数字01到31
//D星期中的第几天,文本表示,3个字母Mon到Sun
//j月份中的第几天,没有前导零1到31
//l(“L”的小写字母)星期几,完整的文本格式Sunday到Saturday
//NISO-8601格式数字表示的星期中的第几天(PHP5.1.0新加)1(表示星期一)到7(表示星期天)
//S每月天数后面的英文后缀,2个字符st,nd,rd或者th。
可以和j一起用
//w星期中的第几天,数字表示0(表示星期天)到6(表示星期六)
//z年份中的第几天0到366
//星期------
//WISO-8601格式年份中的第几周,每周从星期一开始(PHP4.1.0新加的)
//月------
//F月份,完整的文本格式,例如January或者MarchJanuary到December
//m数字表示的月份,有前导零01到12
//M三个字母缩写表示的月份Jan到Dec
//n数字表示的月份,没有前导零1到12
//t给定月份所应有的天数28到31
//年------
//L是否为闰年如果是闰年为1,否则为0
//oISO-8601格式年份数字。
这和Y的值相同,只除了如果ISO的星期数(W)属于前一年或下一年,则用
//那一年。
(PHP5.1.0新加)Examples:
1999or2003
//Y4位数字完整表示的年份例如:
1999或2003
//y2位数字表示的年份例如:
99或03
//时间------
//a小写的上午和下午值am或pm
//A大写的上午和下午值AM或PM
//BSwatchInternet标准时000到999
//g小时,12小时格式,没有前导零1到12
//G小时,24小时格式,没有前导零0到23
//h小时,12小时格式,有前导零01到12
//H小时,24小时格式,有前导零00到23
//i有前导零的分钟数00到59
//s秒数,有前导零00到59
//时区------
//e时区标识(PHP5.1.0新加)例如:
UTC,GMT,Atlantic/Azores
//I是否为夏令时如果是夏令时为1,否则为0
//O与格林威治时间相差的小时数例如:
+0200
//T本机所在的时区例如:
EST,MDT(在Windows下为完整文本格式,例如“Eastern
//StandardTime”,中文版会显示“中国标准时间”)。
//Z时差偏移量的秒数。
UTC西边的时区偏移量总是负的,UTC东边的时区偏移量总是正的。
-43200到43200
//完整的日期/时间------
//cISO8601格式的日期(PHP5新加)2004-02-12T15:
19:
21+00:
00
//rRFC822格式的日期例如:
Thu,21Dec200016:
01:
07+0200
//U从Unix纪元(January1197000:
00:
00GMT)开始至今的秒数参见time()
//格式字串中不能被识别的字符将原样显示。
Z格式在使用gmdate()时总是返回0。
//取当前默认时区时间的24小时时间值,赋于$t['hours']
$t =array('hours'=>gmdate('G',$timestamp+$db_timedf*3600));
//floor--舍去法取整
//今天的起始时间
$tdtime =(floor($timestamp/3600)-$t['hours'])*3600;
//是否需要更新在线情况标记
$runfc ='N';
//如果上次访问时间和当前时间的时间差大于论坛设置的在线用户时限
//或者板块$fid不为空且不等于cookie中的上次访问板块id
//或者上次访问板块id的cookie存在且$wind_in(论坛动作)为hm(论坛首页)
if($timestamp-$lastvisit>$db_onlinetime||($fid&&$fid!
=GetCookie('lastfid'))||(GetCookie('lastfid')&&$wind_in=='hm')){
//设置cookie中上次访问板块id
Cookie('lastfid',$fid);
//设置$runfc为Y
$runfc='Y';
//包含data/userglobal.php文件,如果其中有重复包含,略过
require_once(R_P.'require/userglobal.php');
}
//包含require/db_'.$database.'.php文件,如果其中有重复包含,略过(此处为db_mysql.php)
require_once(R_P.'require/db_'.$database.'.php');
//创建数据库连接
$db=newDB($dbhost,$dbuser,$dbpw,$dbname,$pconnect);
//销毁$dbhost,$dbuser,$dbpw,$dbname,$pconnect,$manager_pwd变量
unset($dbhost,$dbuser,$dbpw,$dbname,$pconnect,$manager_pwd);
//从cookie中取得wi