2009年4月19日星期日

Punbb源码分析---admin/install.php

Punbb的安装文件系admin目录下的install.php文件.
1.使用define方法定义常量.
define('FORUM_VERSION', '1.3.3');论坛版本1.3.3
define('FORUM_DB_REVISION', 4);论坛数据库?
define('MIN_PHP_VERSION', '4.3.0');最低php版本要求4.3.0
define('MIN_MYSQL_VERSION', '4.1.2');最低mysql版本要求4.1.2

define('FORUM_ROOT', '../');论坛根目录
define('FORUM', 1);FORUM常量
define('FORUM_DEBUG', 1);FORUM_DEBUG常量

define('FORUM_SEARCH_MIN_WORD', 3);论坛搜索关键字最小长度
define('FORUM_SEARCH_MAX_WORD', 20);论坛搜索关键字最大长度
---
常量分类:
0)论坛版本
1)论坛安装,运行环境要求:PHP,Mysql的版本
2)论坛控制要求:根目录,关键字长度限定,以及是否可调用常量.
这里要特别注意的是:
0)FORUM_ROOT常量之所以是使用../即一个父目录形式是因为install.php位于admin目录之下.
1)其他?FORUM_DB_REVISION?

2.判断是否已经安装punbbs
if (file_exists(FORUM_ROOT.'config.php'))
exit('The file \'config.php\' already exists which would mean that PunBB is already installed. You should go here instead.');
---
通过使用file_exists方法检查config.php是否存在,以判断punbb是否已经安装,如果存在该文件则提示已经安装了punbb,并且显示一个到主页(index.php)的超链接.
注意:
0)很多程序都使用config.php类的文件(即配置文件)的存在与否来判断,该程序是否已经安装.?
1)PHP中的字符串使用''来包围,连接以.进行.
2)一般情况下特别严重的错误是需要中止当前运行的脚本,并且显示错误信息时,使用exit方法.

3.判断PHP版本是否达到要求.
// Make sure we are running at least MIN_PHP_VERSION
if (!function_exists('version_compare') version_compare(PHP_VERSION, MIN_PHP_VERSION, '<')) exit('You are running PHP version '.PHP_VERSION.'. PunBB requires at least PHP '.MIN_PHP_VERSION.' to run properly. You must upgrade your PHP installation before you can continue.'); --- 通过使用function_exists方法来判断version_compare方法是否存存,然后通过version_compare来判断当前PHP版本是否不小于MIN_PHP_VERSION也就是4.3.0,来最终判断PHP版本是否达标. 注意: 0)大多数的PHP版本控制都是使用相类似的语句. 4.设置错误报告模式. // Disable error reporting for uninitialized variables error_reporting(E_ALL); --- 设置为报告所有错误.?除了未初始化变量? 5.关闭脚本执行超时错误. // Turn off PHP time limit @set_time_limit(0); --- 注意: 0)@符号表示忽略本函数(语句?)造成的错误. 6.加载include/functions.php // We need some stuff from functions.php require FORUM_ROOT.'include/functions.php'; --- 显然punbb将一些包含的库文件统一放在include目录下. 注:mediawiki也有这样一include目录. 7.加载UTF-8函数. // Load UTF-8 functions require FORUM_ROOT.'include/utf8/utf8.php'; require FORUM_ROOT.'include/utf8/ucwords.php'; require FORUM_ROOT.'include/utf8/trim.php'; --- 载入各种用于处理DBCMS?UTF8?UNICODE的函数? 8.调用function_remove_bad_characters函数. // Strip out "bad" UTF-8 characters forum_remove_bad_characters(); --- forum_remove_bad_characters函数位于include/functions中.如下所示 // Removes any "bad" characters (characters which mess with the display of a page, are invisible, etc) from user input function forum_remove_bad_characters() { global $bad_utf8_chars; $bad_utf8_chars = array("\0", "\xc2\xad", "\xcc\xb7", "\xcc\xb8", "\xe1\x85\x9F", "\xe1\x85\xA0", "\xe2\x80\x80", "\xe2\x80\x81", "\xe2\x80\x82", "\xe2\x80\x83", "\xe2\x80\x84", "\xe2\x80\x85", "\xe2\x80\x86", "\xe2\x80\x87", "\xe2\x80\x88", "\xe2\x80\x89", "\xe2\x80\x8a", "\xe2\x80\x8b", "\xe2\x80\x8e", "\xe2\x80\x8f", "\xe2\x80\xaa", "\xe2\x80\xab", "\xe2\x80\xac", "\xe2\x80\xad", "\xe2\x80\xae", "\xe2\x80\xaf", "\xe2\x81\x9f", "\xe3\x80\x80", "\xe3\x85\xa4", "\xef\xbb\xbf", "\xef\xbe\xa0", "\xef\xbf\xb9", "\xef\xbf\xba", "\xef\xbf\xbb", "\xE2\x80\x8D");bad字符组 ($hook = get_hook('fn_remove_bad_characters_start')) ? eval($hook) : null; ;如果存在fn_remove_bad_characters_start函数则执行它. function _forum_remove_bad_characters($array);函数内部函数用于替换数组当中的bad字符 { global $bad_utf8_chars; return is_array($array) ? array_map('_forum_remove_bad_characters', $array) : str_replace($bad_utf8_chars, '', $array); } $_GET = _forum_remove_bad_characters($_GET);处理get方法发送过来的信息 $_POST = _forum_remove_bad_characters($_POST);处理POST方法发送过来的信息 $_COOKIE = _forum_remove_bad_characters($_COOKIE);处理cookie信息 $_REQUEST = _forum_remove_bad_characters($_REQUEST);包含$_POST,$_GET,$_SESSION数组. } --- 注意: 0)Punbb的Hook机制,每个函数均可在函数开始和结束处添加start或者end hook函数. 1)UNICODE字符集以及DBCS,UTF,UTF8,UTF16,UTF32.等. 3)GET,POST,COOKIE,SEESION数组. 4)去除bad characters所使用的递归方法.(小型递归方法) 9.生成config.php所需要的信息的函数: // // Generate output to be used for config.php // function generate_config_file() { global $db_type, $db_host, $db_name, $db_username, $db_password, $db_prefix, $base_url, $cookie_name; return ' 1)
$dual_mysql = true;
}
if (function_exists('sqlite_open'))
$db_extensions[] = array('sqlite', 'SQLite');
if (function_exists('pg_connect'))
$db_extensions[] = array('pgsql', 'PostgreSQL');

if (empty($db_extensions))
error($lang_install['No database support']);

// Make an educated guess regarding base_url
$base_url_guess = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https://' : 'http://').preg_replace('/:80$/', '', $_SERVER['HTTP_HOST']).substr(str_replace('\\', '/', dirname($_SERVER['SCRIPT_NAME'])), 0, -6);
if (substr($base_url_guess, -1) == '/')
$base_url_guess = substr($base_url_guess, 0, -1);

// Check for available language packs
$languages = get_language_packs();
?>
---
这一段是判断支持的数据库类型,基URL地址的判断,以及语言包的判断.

Punbb源码分析---准备工作

1.Php Expert Editor:http://www.phpexperteditor.com/
用于查看PHP文件.
2.WAMP环境.Windows/Apache2.2+/PHP 5.0+/Mysql
特别注意:[1]php_manal_en.chm
3.Punbb:http://punbb.informer.com/
4.基本php知识.