PHP前端页面二次发或优化
1 篇帖子 分页: 1 / 1
帖子mxj333 » 2014年 3月 3日 11:32 星期一
该文件特别重要,其中做了很多事情,主要包括:
1.包含 很多需要的文件,如下所示:
代码: 全选
require_once('include/defines.inc.php');
      require_once('include/func.inc.php');
      require_once('include/html.inc.php');
        require_once('include/copt.lib.php');
        require_once('include/profiles.inc.php');
        require_once('conf/maintenance.inc.php');
 
        require_once('include/nodes.inc.php');
        require_once('include/hosts.inc.php');
        require_once('include/items.inc.php');
        require_once('include/triggers.inc.php');
        require_once('include/graphs.inc.php');
 
        require_once('include/maps.inc.php');
        require_once('include/acknow.inc.php');
        require_once('include/services.inc.php');
        require_once('include/httptest.inc.php');
 
        include_once('include/actions.inc.php');
        include_once('include/discovery.inc.php');
 
        require_once('include/sounds.inc.php');
        require_once('include/images.inc.php');
        require_once('include/events.inc.php');
        require_once('include/scripts.inc.php');
        require_once('include/maintenances.inc.php');
        require_once('include/valuemap.inc.php');
 
        require_once('include/users.inc.php');


分析:
特别关注的是下面这几个语句:
代码: 全选
require_once('include/defines.inc.php'); // 定义了很多的常量
require_once('include/func.inc.php');  // 定义了 zabbix需要的函数集
require_once('include/users.inc.php');  // 定义了 与Zabbix用户相关的 API





2. 全局变量的声明 和初始化
代码: 全选
// GLOBALS
        global $USER_DETAILS, $USER_RIGHTS, $page;
 
        global $ZBX_LOCALNODEID, $ZBX_LOCMASTERID, $ZBX_CONFIGURATION_FILE, $DB;
        global $ZBX_SERVER, $ZBX_SERVER_PORT;
        global $ZBX_LOCALES;
// END OF GLOBALS
 
        $page = array();
        $USER_DETAILS        = array();
        $USER_RIGHTS        = array();
 
        $ZBX_LOCALNODEID = 0;
        $ZBX_LOCMASTERID = 0;
 
        $ZBX_CONFIGURATION_FILE = './conf/zabbix.conf.php';
        $ZBX_CONFIGURATION_FILE = realpath(dirname($ZBX_CONFIGURATION_FILE)).'/'.basename($ZBX_CONFIGURATION_FILE);


分析:这里特别要注意的是这几个全局变量:
$USER_DETAILS: 包含了当前访问 zabbix的 用户信息
$ZBX_CONFIGURATION_FILE: 包含 访问mysql数据库的信息的 配置文件的路径
$DB: 全局数组,包含了从配置文件读取的 访问mysql数据库的 相关信息

3. 读取访问mysql数据库的配置文件信息并 保存到全局变量 $DB中
1) 读取配置文件信息,将其保存到$DB中,相关代码如下:
代码: 全选
if(file_exists($ZBX_CONFIGURATION_FILE) && !isset($_COOKIE['ZBX_CONFIG']) && !isset($DENY_GUI)){
                $config = new CConfigFile($ZBX_CONFIGURATION_FILE);
                if($config->load()){
                        $config->makeGlobal();
                }
                else{
                        $show_warning = true;
                        define('ZBX_DISTRIBUTED', false);
                        define('ZBX_PAGE_NO_AUTHORIZATION', true);
                        error($config->error);
                }
 

2) 访问mysql数据库,将数据库连接保存到 $DB['DB']中

代码: 全选
require_once('include/db.inc.php');
 
                if(!isset($show_warning)){
                        $error = '';
                        if(!DBconnect($error)){
                                $_REQUEST['message'] = $error;
 
                                define('ZBX_DISTRIBUTED', false);
                                define('ZBX_PAGE_NO_AUTHORIZATION', true);
 
                                $show_warning = true;
                        }


Db.inc.php文件包含了DBconnect的定义:

代码: 全选
function DBconnect(&$error){
                   $result = true;
 
                   global $DB;
 
                   $DB['DB'] = null;
                   $DB['TRANSACTIONS'] = 0;
 
//Stats
                   $DB['SELECT_COUNT'] = 0;
                   $DB['EXECUTE_COUNT'] = 0;
 
                   if(!isset($DB['TYPE'])){
                            $error = "Unknown database type.";
                            $result = false;
                   }
                   else{
                            $DB['TYPE'] = zbx_strtoupper($DB['TYPE']);
 
                            switch($DB['TYPE']){
                                     case 'MYSQL':
                                               $mysql_server = $DB['SERVER'].( !empty($DB['PORT']) ? ':'.$DB['PORT'] : '');
 
                                               if (!$DB['DB']= mysql_connect($mysql_server,$DB['USER'],$DB['PASSWORD'])){
                                                        $error = 'Error connecting to database ['.mysql_error().']';
                                                        $result = false;
                                               }
                                               else{
                                                        if(!mysql_select_db($DB['DATABASE'])){
                                                                 $error = 'Error database in selection ['.mysql_error().']';
                                                                 $result = false;
                                                        }
                                                        else{
                                                                 DBexecute('SET NAMES utf8');
                                                        }
                                               }
                                               break;
                                     … …
                                     … …
                                     default:
                                               $error = 'Unsupported database';
                                               $result = false;
                            }
                   }
                   if(false == $result)
                            $DB['DB'] = null;
 
                   return $result;
}


4. 检查当前用户的访问权限 并 加载 本地语言包

代码: 全选
if(!defined('ZBX_PAGE_NO_AUTHORIZATION') && !defined('ZBX_RPC_REQUEST')){
                check_authorisation();
 
                if(file_exists('include/locales/'.$USER_DETAILS['lang'].'.inc.php')){
                        include_once('include/locales/'.$USER_DETAILS['lang'].'.inc.php');
                        process_locales();
                }
 
                include_once('include/locales/en_gb.inc.php');
                process_locales();


参看:
include/perm.inc.php中定义了 check_authorisation():

代码: 全选
function check_authorisation(){
        global $USER_DETAILS;
        $sessionid = get_cookie('zbx_sessionid');
 
        $user = array('sessionid'=>$sessionid);
        if(!$auth = CUser::checkAuthentication($user)){
                include_once('include/locales/en_gb.inc.php');
                process_locales();
 
                if(!isset($_REQUEST['request'])){
                        $parsedUrl = new Curl($_SERVER['REQUEST_URI']);
                        if(!zbx_empty($parsedUrl->getPath()) && !preg_match('/.*\/(index.php)?$/i', $parsedUrl->getPath())){
                                $_REQUEST['request'] = $_SERVER['REQUEST_URI'];
                        }
                }
 
                include('index.php');
                exit();
        }
 
return $auth;
}


api/classes/class.cuser.php定义了CUser::checkAuthentication($user)
代码: 全选
/**
 * Check if session ID is authenticated
 *
 * {@source}
 * @access public
 * @static
 * @since 1.8
 * @version 1
 *
 * @param _array $session
 * @param array $session['sessionid'] Session ID
 * @return boolean
 */
        public static function checkAuthentication($user=null){
                global        $USER_DETAILS;
                global        $ZBX_LOCALNODEID;
                global        $ZBX_NODES;
 
                $sessionid = is_null($user)?null:$user['sessionid'];
 
                $USER_DETAILS = NULL;
                $login = FALSE;
 
                if(!is_null($sessionid)){
                        $sql = 'SELECT u.*,s.* '.
                                        ' FROM sessions s,users u'.
                                        ' WHERE s.sessionid='.zbx_dbstr($sessionid).
                                                ' AND s.status='.ZBX_SESSION_ACTIVE.
                                                ' AND s.userid=u.userid'.
                                                ' AND ((s.lastaccess+u.autologout>'.time().') OR (u.autologout=0))'.
                                                ' AND '.DBin_node('u.userid', $ZBX_LOCALNODEID);
 
                        $login = $USER_DETAILS = DBfetch(DBselect($sql));
 
                        if(!$USER_DETAILS){
                                $incorrect_session = true;
                        }
                        else if($login['attempt_failed']){
                                DBexecute('UPDATE users SET attempt_failed=0 WHERE userid='.$login['userid']);
                        }
                }
 
                if(!$USER_DETAILS && !isset($_SERVER['PHP_AUTH_USER'])){
                        $sql = 'SELECT u.* '.
                                ' FROM users u '.
                                ' WHERE u.alias='.zbx_dbstr(ZBX_GUEST_USER).
                                        ' AND '.DBin_node('u.userid', $ZBX_LOCALNODEID);
                        $login = $USER_DETAILS = DBfetch(DBselect($sql));
 
                        if(!$USER_DETAILS){
                                $missed_user_guest = true;
                        }
                        else{
                                $sessionid = zbx_session_start($USER_DETAILS['userid'], ZBX_GUEST_USER, '');
                        }
                }
 
                // Perm to login, perm to system
                if($login){
                        $login = (check_perm2login($USER_DETAILS['userid']) && check_perm2system($USER_DETAILS['userid']));
                }
 
                if(!$login){
                        $USER_DETAILS = NULL;
                }
 
                if($login && $sessionid && !isset($incorrect_session)){
                        zbx_setcookie('zbx_sessionid',$sessionid,$USER_DETAILS['autologin']?(time()+86400*31):0);        //1 month
                        DBexecute('UPDATE sessions SET lastaccess='.time().' WHERE sessionid='.zbx_dbstr($sessionid));
 
                        if($USER_DETAILS['autologout'] > 0){
                                DBexecute('DELETE FROM sessions WHERE userid='.$USER_DETAILS['userid'].' AND status='.ZBX_SESSION_ACTIVE.' AND lastaccess<'.(time() - $USER_DETAILS['autologout']));
                        }
                }
                else{
                        self::logout($sessionid);
                }
 
                if($USER_DETAILS){
                        if(isset($ZBX_NODES[$ZBX_LOCALNODEID])){
                                $USER_DETAILS['node'] = $ZBX_NODES[$ZBX_LOCALNODEID];
                        }
                        else{
                                $USER_DETAILS['node'] = array();
                                $USER_DETAILS['node']['name'] = '- unknown -';
                                $USER_DETAILS['node']['nodeid'] = $ZBX_LOCALNODEID;
                        }
 
                        $USER_DETAILS['debug_mode'] = get_user_debug_mode($USER_DETAILS['userid']);
                }
                else{
                        $USER_DETAILS = array(
                                'alias'        => ZBX_GUEST_USER,
                                'userid'=> 0,
                                'lang'        => 'en_gb',
                                'type'        => '0',
                                'node'        => array( 'name'=>'- unknown -', 'nodeid'=>0 )
                        );
                }
 
                $userip = (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_X_FORWARDED_FOR']))?$_SERVER['HTTP_X_FORWARDED_FOR']:$_SERVER['REMOTE_ADDR'];
                $USER_DETAILS['userip'] = $userip;
 
                if(!$login || isset($incorrect_session) || isset($missed_user_guest)){
 
                        if(isset($incorrect_session))        $message = 'Session terminated, re-login, please'; // S_CUSER_ERROR_SESSION_TERMINATED
                        else if(isset($missed_user_guest)){
                                $row = DBfetch(DBselect('SELECT count(u.userid) as user_cnt FROM users u'));
                                if(!$row || $row['user_cnt'] == 0){
                                        $message = 'Table users is empty. Possible database corruption.'; // S_CUSER_ERROR_TABLE_USERS_EMPTY
                                }
                        }
 
                        if(!isset($_REQUEST['message']) && isset($message)) $_REQUEST['message'] = $message;
 
                return false;
                }
 
        return true;
        }
}
 
zabbix中文论坛:http://www.zabbix.net.cn 或者 www.zabbix.org.cn
1 篇帖子 分页: 1 / 1

登录

在线用户

正在浏览此版面的用户:没有注册用户 和 4 位游客