T086学习网 | 站长学院 | 技术文档 | 成语 | 歇后语 | 帝国时代 | 代码收藏 | IP地址查询 | 生活百科 | 生日密码 | CSS压缩 | 用户评论 | 欣欣百宝箱

PHPCMS 的头程序文件include/common.inc.php讲解

【 网络作者:逆雪寒 更新时间:2010-01-16 | 字体:
[导读]这个文件是程序启动的核心文件<?php/**代码讲解分析: 逆雪寒. 2007 - 12 - 20*/$mtime = explode(’ ‘, microtime());$phpcms_starttime = $mtime[1] + $mtime[0];/**计算脚本开始运行的时间。很常见的写法。最...

这个文件是程序启动的核心文件

<?php
/**
代码讲解分析: 逆雪寒. 2007 - 12 - 20
*/
$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);
/**
把 $HTTP_ENV_VARS $HTTP_POST_VARS 全局变量设置为 NULL 因为php4.1.0以上默认以 $_POST 来替代。unset后防止程序运行在低版本会出现安全等问题。比如变量注入
*/
set_magic_quotes_runtime(0);
//地球人都知道。关了字符窜入库自动转意 比如 my name is on’x 转成 my name is on ’x 为了最大的程序性能所以我们关掉吧~哈哈
define(’IN_PHPCMS’, TRUE);
/**
程序入口标记。为什么需要这个东西呢。就好比你进一个小区,保安大哥哥肯定要你签字或是挂个鸟牌证明你是从正门进来的。
防止你翻墙进入去偷东西搞破坏。这个入口标记也有这个功能。 在这里定义了一个常量 IN_PHPCMS 为 TRUE ,然后我在其他程序文件里面检查这个标记。如果不存在或不为真,
那么就基本可以肯定你这个家伙是个小偷来的。 人可能翻墙进入。但程序怎么翻墙呢。只要在php.ini文件里面激活 allow_url_fopen选项,include() 就可以包含 URL 地址了。你想下如果你有个 放密码的PHP文件。如果给人家include 了以后。你怕不怕。
*/
define(’PHPCMS_ROOT’, str_replace(”\”, ‘/’, substr(dirname(__FILE__), 0, -8)));
/**
为了程序产品的跨平台。自动获取程序的安装目录路径 ,定义为 PHPCMS_ROOT 常量。方便以后程序使用。建议大家都这样做哦
*/
require PHPCMS_ROOT.’/include/global.func.php’;
/**
包含 全局函数 global.func.php 文件。里面放了些程序全局都有需要用的函数.大家看到了吧。 常量 PHPCMS_ROOT 已经发挥作用。 这样程序给人家发布到了 二级目录下。也不需要人家手动改整站根目录路径了。
自己好好理解下。。。。。
*/
$search_arr = array(”/ union /i”,”/ select /i”,”/ update /i”,”/ outfile /i”,”/ or /i”);
/**
(”/ union /i”) 这个是正则的写法?不懂正则的自己百度找教程来学。 这里不详细说了
*/
$replace_arr = array(’ union ‘,’ select ‘,’ update ‘,’ outfile ‘,’ or ‘);
/**
看这个意思很明了。 union :连接两条SQL语句。 outfile : 主要用来导出数据库资料到其他介质上。
干啥字要定义这两个变量呢? 在 global.func.php 文件(前面已经加载)里面有个函数 strip_sql() 各位可以看下。
function strip_sql($string)
{
global $search_arr,$replace_arr;
return is_array($string) ? array_map(’strip_sql’, $string) : preg_replace($search_arr, $replace_arr, $string);
}
函数里面定义了这两个变量为 global全局变量。 那么函数里就可以直接使用了。 先讲解下这个函数吧。 顾名思义这个函数是过滤字符窜里面的SQL语句使得关键的SQL语句单词失效。
主要过滤那些SQL语句呢。 主要是这几个关键字: union select update outfile or 等。因为这几个SQL字是极度容易在$_GET传输中给截注.
这个函数写得实在精妙。 is_array 来判断 $string 是否为数组。如果 是 就 array_map() 函数来递归过滤 $string数组里面的每一个单元. 每个单元是一个字符窜吧?
当递归调用 strip_sql() 以后 is_array()判断 $string 肯定为假了,因为$string已经不是数组而是字符窜。所以 执行 preg_replace()函数。这个函数很好理解了。就是替换了。
*/
$_POST = strip_sql($_POST);
$_GET = strip_sql($_GET);
$_COOKIE = strip_sql($_COOKIE);
/**
使用strip_sql()函数来过滤 $_POST $_GET $_COOKIE;
一般不是开源的站。很少过SQL关键字过滤。不过这个也是冒很大风险的。
*/
unset($search_arr, $replace_arr);
/**
unset 使用过但以后不需要的变量。这个是很好的习惯。第一不会浪费内存。如果变量存了大量的数据字节,而后你的程序是一直不需要用的。那么
就会很浪费内存。拉底程序性能 . 哈哈。真很书面。反正是好习惯我们都要学习的拉。
*/
$magic_quotes_gpc = get_magic_quotes_gpc(); // get_magic_quotes_gpc()检测gpc是否系统自动转意。 gpc 是什么呢? GET POST COOKIE 来来去去就这几个东西罗。会返回 真或假
if(!$magic_quotes_gpc)
{
$_POST = new_addslashes($_POST);
$_GET = new_addslashes($_GET);
}
/**
判断一下系统是否打开了自动对gpc进行转意这个选择。如果是的话,就不需要我们自动转意了。如果不是那么还是要老百姓的手段。自己动手丰衣足食。
来看下也是在global.func.php 文件里面定义的这个函数: 其实是一个封装好的php的 addslashes() 函数的函数。PHP都自己有了为什么还要自己封装成函数呢?
理由很简单。为了以后的扩展更改容易罗。如果我们一开始就全部用 addslashes() 这个函数来对 ‘ 进行转意的话。那么以后随着程序的发展。我可能想多过滤个 ^ * ( )之类的
那如何是好呢?所以为了以后孩子的成长。我们还是最好封起来吧。 记住:以后有可能会边的东西。最好都封装成模块。函数 。类。 这样程序的灵活度就上去了。
function new_addslashes($string)
{
if(!is_array($string)) return addslashes($string);
foreach($string as $key => $val) $string[$key] = new_addslashes($val);
return $string;
}
这个函数也是写得贼好。也是同时考虑过滤 字符窜或数组,也是使用了 传归。看下就应该明白了吧。这个不用说了。我们要学下这个思路这个方法方式哦。这样才能进步。
哈哈。我们要懂模仿。
*/
@extract($_POST, EXTR_OVERWRITE);
@extract($_GET, EXTR_OVERWRITE);
/**
嘿。 extract 前面加个 @鸡蛋做什么呢??抑制错误的。还不懂的话。自己百度了。
为什么用extract()函数呢. 平时我们程序 是不是要常使用 $_POST $_GET来获取传递的变量呀。是不是感觉贼麻烦呀。
比如 $_POST['xx'] 这样接受是挺好。但写多了很麻烦是吧。我是感觉麻烦。我现在想直接就 $xx就可以获取传递过来的东西。那怎么办呢。
就用了 extract()函数来实现这么一个技巧。 这个技巧在discuz 论坛上也有应用。
*/
unset($_POST, $_GET);
/**
unset() 好处不用说了吧。 释放 $_POST $_GET 数组 ,因为已经不需要他们了。
*/
?>

明天放假了.今天在写点罗.放假没空写了.要陪老婆,大家看了有什么不明白的.可以跟帖问.我懂的我会回答.谢谢
继续::

2007-12-21

吃完中午开始分析了点代码.时间不多.复制PHP内容到剪贴板PHP代码:
/**
代码讲解分析: 逆雪寒. 2007 - 12 - 21
*/
require PHPCMS_ROOT.’/config.inc.php’;
/**
加栽整站的配置参数文件。一般的程序都会有这个文件。做什么的呢?比如一些数据库连接地址。用户名,密码等。需要用到的参数都定义在这个文件里面。这样以后配置变了。我们只要改动下这个文件里面的
变量值就好。是不是很方便呢。呵呵. 在这里说下 require() 这个加载函数。 require 和 include 都是用来加载其他PHP文件用的。但他们是有区别的。 require 函数:是”预解释”函数。就是程序一加载,就执行了require函数。而include 呢。是个过程加载函数。我们可以在逻辑里比如: if 里面使用include 来动态的加载其他程序片段。而require 就不行。*/
require PHPCMS_ROOT.’/languages/’.$CONFIG['language'].’/phpcms.lang.php’;
/**

顾名思义: 这个就是加载语言包了。PHP的国际化目前做得最多的。就是直接用PHP文件来实现。 在 phpcms.lang.php 文件里面定义程序中要用到的中文信息。然后在程序一开始就加载。那里程序里面
就可以使用这个文件里面的变量和一切。那么就简单了。模板上就不需要直接写中文信息了。直接用这个文件里面定义的变量等来替换。从而实现国际化。over!!!最好自己打开这个语言文件再加上自己思考下。就知道。原来如此简单。
*/
define(’PHPCMS_PATH’, $CONFIG['rootpath']);
define(’PHPCMS_CACHEDIR’, $CONFIG['cachedir']);
/**
$CONFIG['rootpath'] 这个就是全局配置文件 config.inc.php 文件里面数据库信息。等全部配置信息。在这里把他们定义为 常量。 为什么需要定义为常量呢。因为作者感觉这样写爽罗。呵呵。其实因为后面
用到这两个变量多。所以干脆定义为常量。方便使用。再多说一个技巧: $CONFIG['rootpath'] 其实也可以写成 $CONFIG[rootpath] 但是最好不要这样。为什么呢。因为PHP引擎会先判断 rootpath 是不是常量。如果不是才会认定    $CONFIG[rootpath] 是数组。 这样性能上就差了一点点了。 再多说一个技巧: 为什么程序多数都用 ” 单引号呢而不用 “” 双引号呢。因为这样效率好, “” 双引号。
php引擎还会先检查里面是否有变量,如果有就解释。而 ” 单引号不会做这一步的检查。而直接就当成字符窜了。所以效率上也会有一点点影响哦。
*/
$CONFIG['enablephplog'] ? set_error_handler(’phpcms_error’) : error_reporting(E_ERROR | E_WARNING | E_PARSE);
/**
$CONFIG['enablephplog'] 是否开启错误日志设置。这个设置在全局配置文件里面.config.inc.php 。 这里使用了 三目运算符   偶最喜欢用了。一些简短的逻辑判断。可以使用 ? : ; 来实现比较简洁
set_error_handler() 这个函数就大有来头了。php4里面的典型自定义程序出错后行为的一个函数。十分好用。怎么用呢? set_error_handler(函数) 的参数也是一个函数。这个函数。反映了程序出错后行为的。
phpcms_error 函数存在 global.func.php 全局函数里面。

function phpcms_error($errno, $errmsg, $filename, $linenum, $vars)
{
$filename = str_replace(PHPCMS_ROOT, ‘.’, $filename);
$filename = str_replace(”\”, ‘/’, $filename); //  把win平台的 \ 换成  /兼容常见系统的路径
if(!defined(’E_STRICT’)) define(’E_STRICT’, 2048);
$dt = date(’Y-m-d H:i:s’);
$errortype = array (  
E_ERROR => ‘Error’,
E_WARNING => ‘Warning’,
E_PARSE => ‘Parsing Error’,
E_NOTICE => ‘Notice’,
E_CORE_ERROR => ‘Core Error’,
E_CORE_WARNING => ‘Core Warning’,
E_COMPILE_ERROR => ‘Compile Error’,
E_COMPILE_WARNING => ‘Compile Warning’,
E_USER_ERROR => ‘User Error’,
E_USER_WARNING => ‘User Warning’,
E_USER_NOTICE => ‘User Notice’,
E_STRICT => ‘Runtime Notice’
);
$user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE);
$err = “<errorentry> ”;
$err .= “ <datetime>” . $dt . “</datetime> ”;
$err .= “ <errornum>” . $errno . “</errornum> ”;
$err .= “ <errortype>” . $errortype[$errno] . “</errortype> ”;
$err .= “ <errormsg>” . $errmsg . “</errormsg> ”;
$err .= “ <scriptname>” . $filename . “</scriptname> ”;
$err .= “ <scriptlinenum>” . $linenum . “</scriptlinenum> ”;
if (in_array($errno, $user_errors))
{
$err .= “ <vartrace>” . wddx_serialize_value($vars, “Variables”) . “</vartrace> ”;
}
$err .= “</errorentry> ”;
echo $err;
error_log($err, 3, PHPCMS_ROOT.’/data/php_error_log.xml’);
chmod(PHPCMS_ROOT.’/data/php_error_log.xml’, 0777);
}
就是这个鸟蛋。 现在我们慢慢来干掉他。呵呵  这个自定义出错信息函数默认带有四个参数。 第一个参数 $errno 是程序出错的等级。 第二参数是程序出错的界面信息。第三是出现错误的程序文件名。
第四是 第几行出现错误。第五个参数。要不要都行是当前变量状态的快照.看吧。我们有这些信息后。想定义怎么样的错误信息给客户看都很容易了是吧?

  • 转载请注明来源:IT学习网 网址:http://www.t086.com/ 向您的朋友推荐此文章
  • 特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系我们,我们会尽快予以更正。
更多
留言建议ASP探针PHP探针站长Enjoy的Blog
© 2017 T086学习网 - T086.com(原itlearner.com)
RunTime:14.32ms QueryTime:7