你现在的位置:首页 > PHP网站建设知识库 > phpbb > 正文

phpbb开发之源码解析common.php

phpbb开发,当前要掌握它的核心源代码,了解它的运行机制。

<?php
/**
*
* @package phpBB3
* @version $Id: common.php 10299 2009-12-06 02:30:24Z naderman $
* @copyright (c) 2005 phpBB Group
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
* Minimum Requirement: PHP 4.3.3
*/

/**
 * 这个是判断入口文件,主要是为了安全,防止非法调用。
*/
if (!defined('IN_PHPBB'))
{
    exit;
}

//开始时间
/*
 * microtime()返回当前 Unix 时间戳和微秒数
 * 在php5里可以加参数true直接返回一个浮点数,这里没有这样用,可能是为了版本兼容性。
 * 
 */
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];

// Report all errors, except notices and deprecation messages
if (!defined('E_DEPRECATED'))
{
    define('E_DEPRECATED', 8192);
}
error_reporting(E_ALL ^ E_NOTICE ^ E_DEPRECATED);

/*
* Remove variables created by register_globals from the global scope
* Thanks to Matt Kavanagh
* 删除全局变量函数
*/
function deregister_globals()
{
    //
    $not_unset = array(
        'GLOBALS'            => true,
        '_GET'                => true,
        '_POST'                => true,
        '_COOKIE'            => true,
        '_REQUEST'          => true,
        '_SERVER'           => true,
        '_SESSION'          => true,
        '_ENV'                => true,
        '_FILES'            => true,
        'phpEx'                => true,
        'phpbb_root_path'    => true
    );

    // Not only will array_merge and array_keys give a warning if
    // a parameter is not an array, array_merge will actually fail.
    // So we check if _SESSION has been initialised.
    if (!isset($_SESSION) || !is_array($_SESSION))
    {
        $_SESSION = array();
    }

    // Merge all into one extremely huge array; unset this later
    /*
     * array_merge — 合并一个或多个数组
     * array_keys — 返回数组中所有的键名
     * 把$_GET等数组的键名合成一个数组
     */
    $input = array_merge(
        array_keys($_GET),
        array_keys($_POST),
        array_keys($_COOKIE),
        array_keys($_SERVER),
        array_keys($_SESSION),
        array_keys($_ENV),
        array_keys($_FILES)
    );

    foreach ($input as $varname)
    {
        if (isset($not_unset[$varname]))
        {
            // Hacking attempt. No point in continuing unless it's a COOKIE
            if ($varname !== 'GLOBALS' || isset($_GET['GLOBALS']) || isset($_POST['GLOBALS']) || isset($_SERVER['GLOBALS']) || isset($_SESSION['GLOBALS']) || isset($_ENV['GLOBALS']) || isset($_FILES['GLOBALS']))
            {
                exit;
            }
            else
            {
                $cookie = &$_COOKIE;
                while (isset($cookie['GLOBALS']))
                {
                    foreach ($cookie['GLOBALS'] as $registered_var => $value)
                    {
                        if (!isset($not_unset[$registered_var]))
                        {
                            unset($GLOBALS[$registered_var]);
                        }
                    }
                    $cookie = &$cookie['GLOBALS'];
                }
            }
        }

        unset($GLOBALS[$varname]);
    }

    unset($input);
}

// If we are on PHP >= 6.0.0 we do not need some code
//检测PHP6
if (version_compare(PHP_VERSION, '6.0.0-dev', '>='))
{
    /**
    * @ignore
    */
    define('STRIP', false);
}
else
{
    //禁用PHP魔术方法
    @set_magic_quotes_runtime(0);

    // Be paranoid with passed vars
    /*
     * int_get() 取得php.ini中的值
     * strtolower() 全部转化成小写
     * function_exists() 检测函数是否定义
     * 这里先用ini_get检测不知道效率是不是有些低?为什么不把!function_exists('ini_get')提到前面来呢?
     */
    if (@ini_get('register_globals') == '1' || strtolower(@ini_get('register_globals')) == 'on' || !function_exists('ini_get'))
    {
        deregister_globals();
    }
    //get_magic_quotes_gpc() 检测魔术方法是否启用,如果启用为1,否则为0
    define('STRIP', (get_magic_quotes_gpc()) ? true : false);
}

if (defined('IN_CRON'))
{
    //DIRECTORY_SEPARATOR PHP内置常量,路径分割符。win中为/,linux中为/
    //dirname() 返回路径中的目录部分
    $phpbb_root_path = dirname(__FILE__) . DIRECTORY_SEPARATOR;
}
//如果没有找到config.php,提示重新安装
if (!file_exists($phpbb_root_path . 'config.' . $phpEx))
{
    die("<p>The config.$phpEx file could not be found.</p><p><a href="/" mce_href="/""{$phpbb_root_path}install/index.$phpEx/">Click here to install phpBB</a></p>");
}

require($phpbb_root_path . 'config.' . $phpEx);
//PHPBB_INSTALLED 在config.php中定义


if (!defined('PHPBB_INSTALLED'))
{
    /*
     * 作用:重定向到浏览器,并保证重定向后后续代码不被执行(exit)
     * 1、取得主机名
     * 2、取得端口号
     * 3、取得连接类型(是否为https)
     * 4、取得脚本路径,主要是为了判断是不是根目录
     * 5、把/替换为/
     * 6、组合成url(http头)
     */
    // Redirect the user to the installer
    //重新定义到用户安装
    // We have to generate a full HTTP/1.1 header here since we can't guarantee to have any of the information
    // available as used by the redirect function
    
    //getenv() 取得系统的环境变量,参数很多。
    //主机名
    $server_name = (!empty($_SERVER['HTTP_HOST'])) ? strtolower($_SERVER['HTTP_HOST']) : ((!empty($_SERVER['SERVER_NAME'])) ? $_SERVER['SERVER_NAME'] : getenv('SERVER_NAME'));
    //主机端口
    $server_port = (!empty($_SERVER['SERVER_PORT'])) ? (int) $_SERVER['SERVER_PORT'] : (int) getenv('SERVER_PORT');
    //安全链接
    $secure = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 1 : 0;
    
    //脚本名称 这里为:/phpbb/index.php
    $script_name = (!empty($_SERVER['PHP_SELF'])) ? $_SERVER['PHP_SELF'] : getenv('PHP_SELF');
    //如果$script_name为空,!script_name也可以通过
    if (!$script_name)
    {
        $script_name = (!empty($_SERVER['REQUEST_URI'])) ? $_SERVER['REQUEST_URI'] : getenv('REQUEST_URI');
    }

    // Replace any number of consecutive backslashes and/or slashes with a single slash
    //替换反斜线
    // (could happen on some proxy setups and/or Windows servers)
    //可能有一些代理设置,端口号不为80等
    /*
     * trim()函数从字符串的两端删除空白字符和其他预定义字符。
     */
    $script_path = trim(dirname($script_name)) . '/install/index.' . $phpEx;
    $script_path = preg_replace('#[/////]{2,}#', '/', $script_path);

    $url = (($secure) ? 'https://' : 'http://') . $server_name;

    //设置端口,如果不是80.
    //strpos() 函数返回字符串在另一个字符串中第一次出现的位置。
    if ($server_port && (($secure && $server_port <> 443) || (!$secure && $server_port <> 80)))
    {
        //如果主机后面没有:则证明没有添加端口号,这时可以为其添加端口
        // HTTP HOST can carry a port number...
        if (strpos($server_name, ':') === false)
        {
            $url .= ':' . $server_port;
        }
    }

    $url .= $script_path;
    header('Location: ' . $url);
    exit;
}

if (defined('DEBUG_EXTRA'))
{
    $base_memory_usage = 0;
    //获得PHP脚本占用内存
    if (function_exists('memory_get_usage'))
    {
        $base_memory_usage = memory_get_usage();
    }
}

// Load Extensions
//负载扩展???
// dl() is deprecated and disabled by default as of PHP 5.3.
// dl() 已经废弃,在PHP 5.3中默认为关闭
// 这段没有看明白
if (!empty($load_extensions) && function_exists('dl'))
{
    $load_extensions = explode(',', $load_extensions);

    foreach ($load_extensions as $extension)
    {
        @dl(trim($extension));
    }
}
//下面又要跳了,还是老规矩,跳到下面的第一个文件。
// Include files
require($phpbb_root_path . 'includes/acm/acm_' . $acm_type . '.' . $phpEx);
require($phpbb_root_path . 'includes/cache.' . $phpEx);
require($phpbb_root_path . 'includes/template.' . $phpEx);
require($phpbb_root_path . 'includes/session.' . $phpEx);
require($phpbb_root_path . 'includes/auth.' . $phpEx);

require($phpbb_root_path . 'includes/functions.' . $phpEx);
require($phpbb_root_path . 'includes/functions_content.' . $phpEx);

require($phpbb_root_path . 'includes/constants.' . $phpEx);
require($phpbb_root_path . 'includes/db/' . $dbms . '.' . $phpEx);
require($phpbb_root_path . 'includes/utf/utf_tools.' . $phpEx);

// Set PHP error handler to ours
set_error_handler(defined('PHPBB_MSG_HANDLER') ? PHPBB_MSG_HANDLER : 'msg_handler');

// Instantiate some basic classes
$user        = new user();
$auth        = new auth();
$template    = new template();
$cache        = new cache();
$db            = new $sql_db();

// Connect to DB
$db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false, defined('PHPBB_DB_NEW_LINK') ? PHPBB_DB_NEW_LINK : false);

// We do not need this any longer, unset for safety purposes
unset($dbpasswd);

// Grab global variables, re-cache if necessary
$config = $cache->obtain_config();

// Add own hook handler
require($phpbb_root_path . 'includes/hooks/index.' . $phpEx);
$phpbb_hook = new phpbb_hook(array('exit_handler', 'phpbb_user_session_handler', 'append_sid', array('template', 'display')));

foreach ($cache->obtain_hooks() as $hook)
{
    @include($phpbb_root_path . 'includes/hooks/' . $hook . '.' . $phpEx);
}

?>