魔幻精灵

文章 分类 评论
243 7 8

站点介绍

魔幻精灵网

ecshop加速优化 读写主从分离

魔幻精灵 2019-07-06 1572 0条评论 点滴记忆

首页 / 正文

前两天配置好了mysql主从方式,今天就拿ecshop练习读写分离。以下代码仅供学习参考,不成熟的地方,还需完善。



config.php


<?php

 

$db_name   = "ecshop";

 

$prefix    = "ecs_";

 

$timezone    = "Europe/Berlin";

 

$cookie_path    = "/";

 

$cookie_domain    = "";

 

$session = "1440";

 

$_config = array();

 

//数据库主服务器设置, 支持多组服务器设置, 当设置多组服务器时, 则会随机使用某个服务器

$_config['master'][1]['dbhost'] = "192.168.2.175:3306";

$_config['master'][1]['dbname'] = "ecshop";

$_config['master'][1]['dbuser'] = "dragon";

$_config['master'][1]['dbpw'] = "loong";

 

/*

 *$_config['master'][2]['dbhost'] = "";

 *...

 */

 

//数据库从服务器设置( slave, 只读 ), 支持多组服务器设置, 当设置多组服务器时, 系统每次随机使用

$_config['slave'][1]['dbhost'] = "192.168.2.176:3306";

$_config['slave'][1]['dbname'] = "ecshop";

$_config['slave'][1]['dbuser'] = "ivan";

$_config['slave'][1]['dbpw'] = "loong";

 

$_config['slave'][2]['dbhost'] = "192.168.2.177:3306";

$_config['slave'][2]['dbname'] = "ecshop";

$_config['slave'][2]['dbuser'] = "ivan";

$_config['slave'][2]['dbpw'] = "loong";

 

define('EC_CHARSET','utf-8');

 

define('ADMIN_PATH','admin');

 

define('AUTH_KEY', 'this is a key');

 

define('OLD_AUTH_KEY', '');

 

define('API_TIME', '');

 

?>


初始化数据连接类

    /* 初始化数据库类  

     * 如果配置了从服务器,则初始化从库类 

    */  

    if(count($_config['slave'])) {  

        require(ROOT_PATH . 'includes/cls_mysql_slave.php');  

        $db = new cls_mysql_slave($_config);  

    }else{  

        require(ROOT_PATH . 'includes/cls_mysql.php');  

        $db = new cls_mysql($_config);  

    }  


增加cls_mysql_slave.php从库类

<?php

 

require(ROOT_PATH . 'includes/cls_mysql.php');

class cls_mysql_slave extends cls_mysql

{

    var $slaveid = null;

 

    function set_config($config){

        if(!empty($this->config['slave'])) {

            $this->slaveid = array_rand($this->config['slave']);

        }

        parent::set_config($config);

    }

 

    /* 随机分配从库连接 */

    function set_slave_config() {         

        $this->settings = $this->config['slave'][$this->slaveid];

        $this->settings['charset'] = $this->config['charset'];

        $this->settings['pconnect'] = $this->config['pconnect'];

    }

 

    function slave_connect() {

        $this->set_slave_config();

        $dbhost = $this->settings['dbhost'];

        $dbuser = $this->settings['dbuser'];

        $dbpw = $this->settings['dbpw'];

        $dbname = $this->settings['dbname'];

        $this->connect($dbhost, $dbuser, $dbpw, $dbname);

        

    }

 

 

    function query($sql, $type = '') {

        // 如果执行查询操作,则执行从库连接

        if($this->slaveid && strtoupper(substr($sql, 0 , 6)) == 'SELECT') {

            $this->slave_connect();

        }else{

            parent::set_config($this->config);

            $dbhost = $this->settings['dbhost'];

            $dbuser = $this->settings['dbuser'];

            $dbpw = $this->settings['dbpw'];

            $dbname = $this->settings['dbname'];

            $this->connect($dbhost, $dbuser, $dbpw, $dbname);

        }

        return parent::query($sql, $type);

    }

 

    /* 删除失败连接*/

    function del_error_link(){

        unset($this->config['slave'][$this->slaveid]);

        $this->set_config($this->config);

        $this->set_slave_config();

        $dbhost = $this->settings['dbhost'];

        $dbuser = $this->settings['dbuser'];

        $dbpw = $this->settings['dbpw'];

        $dbname = $this->settings['dbname'];

        $this->connect($dbhost, $dbuser, $dbpw, $dbname);

    }

         

}


cls_mysql.php文件类修改

<?php

 

if (!defined('IN_ECS'))

{

    die('Hacking attempt');

}

 

class cls_mysql

{

    var $link_id    = NULL;

 

    var $settings   = array();

 

    var $queryCount = 0;

    var $linkCount = 0;

    var $queryTime  = '';

    var $queryLog   = array();

 

    var $max_cache_time = 300; // 最大的缓存时间,以秒为单位

 

    var $cache_data_dir = 'temp/query_caches/';

    var $root_path      = '';

 

    var $error_message  = array();

    var $platform       = '';

    var $version        = '';

    var $dbhash         = '';

    var $starttime      = 0;

    var $timeline       = 0;

    var $timezone       = 0;

 

    var $mysql_config_cache_file_time = 0;

 

    var $mysql_disable_cache_tables = array(); // 不允许被缓存的表,遇到将不会进行缓存

    var $config = array();

 

    function __construct($config, $charset = 'utf8', $pconnect = 0, $quiet = 0)

    {

        $this->cls_mysql($config, $charset, $pconnect, $quiet);

    }

 

    function cls_mysql($config, $charset = 'utf8', $pconnect = 0, $quiet = 0)

    {

        if(!empty($config)) {

            $config['charset'] = $charset;

            $config['pconnect'] = $pconnect;

            $this->config = $config;

        }

        

        if (defined('EC_CHARSET'))

        {

            $charset = strtolower(str_replace('-', '', EC_CHARSET));

        }

 

        if (defined('ROOT_PATH') && !$this->root_path)

        {

            $this->root_path = ROOT_PATH;

        }

 

        $this->set_config($this->config);

 

        if ($quiet)

        {

            $dbhost = $this->settings['dbhost'];

            $dbuser = $this->settings['dbuser'];

            $dbpw = $this->settings['dbpw'];

            $dbname = $this->settings['dbname'];

            $this->connect($dbhost, $dbuser, $dbpw, $dbname, $charset, $pconnect, $quiet);

        }

    }

 

    //随机分配数据库连接

    function set_config($config) {

        $sid = array_rand($config['master']);

        $settings = $config['master'][$sid];

        $settings['sid'] = $sid;

        $settings['charset'] = $this->config['charset'];

        $settings['pconnect'] = $this->config['pconnect'];

        $this->settings = $settings;

    }

 

    function connect($dbhost, $dbuser, $dbpw, $dbname = '', $charset = 'utf8', $pconnect = 0, $quiet = 0)

    {

        if ($pconnect)

        {

            if (!($this->link_id = @mysql_pconnect($dbhost, $dbuser, $dbpw)))

            {

                if (!$quiet)

                {

                    $this->ErrorMsg("Can't pConnect MySQL Server!");

                }

 

                return false;

            }

        }

        else

        {

            if (PHP_VERSION >= '4.2')

            {

                $this->link_id = @mysql_connect($dbhost, $dbuser, $dbpw, true);

            }

            else

            {

                $this->link_id = @mysql_connect($dbhost, $dbuser, $dbpw);

 

                mt_srand((double)microtime() * 1000000); // 对 PHP 4.2 以下的版本进行随机数函数的初始化工作

            }

            if (!$this->link_id)

            {

                if (!$quiet)

                {                  

                    //连接超过10次,中断连接,抛出错误  

                    if($this->linkCount>9){

                        $this->ErrorMsg("Can't Connect MySQL Server!");

                    } 

                    $this->linkCount++;

                    $this->del_error_link();

                }

 

                return false;

            }

        }

 

        $this->dbhash  = md5($this->root_path . $dbhost . $dbuser . $dbpw . $dbname);

        $this->version = mysql_get_server_info($this->link_id);

 

        /* 如果mysql 版本是 4.1+ 以上,需要对字符集进行初始化 */

        if ($this->version > '4.1')

        {

            if ($charset != 'latin1')

            {

                mysql_query("SET character_set_connection=$charset, character_set_results=$charset, character_set_client=binary", $this->link_id);

            }

            if ($this->version > '5.0.1')

            {

                mysql_query("SET sql_mode=''", $this->link_id);

            }

        }

 

        $sqlcache_config_file = $this->root_path . $this->cache_data_dir . 'sqlcache_config_file_' . $this->dbhash . '.php';

 

        @include($sqlcache_config_file);

 

        $this->starttime = time();

 

        if ($this->max_cache_time && $this->starttime > $this->mysql_config_cache_file_time + $this->max_cache_time)

        {

            if ($dbhost != '.')

            {

                $result = mysql_query("SHOW VARIABLES LIKE 'basedir'", $this->link_id);

                $row    = mysql_fetch_assoc($result);

                if (!empty($row['Value']{1}) && $row['Value']{1} == ':' && !empty($row['Value']{2}) && $row['Value']{2} == "\\")

                {

                    $this->platform = 'WINDOWS';

                }

                else

                {

                    $this->platform = 'OTHER';

                }

            }

            else

            {

                $this->platform = 'WINDOWS';

            }

 

            if ($this->platform == 'OTHER' &&

                ($dbhost != '.' && strtolower($dbhost) != 'localhost:3306' && $dbhost != '127.0.0.1:3306') ||

                (PHP_VERSION >= '5.1' && date_default_timezone_get() == 'UTC'))

            {

                $result = mysql_query("SELECT UNIX_TIMESTAMP() AS timeline, UNIX_TIMESTAMP('" . date('Y-m-d H:i:s', $this->starttime) . "') AS timezone", $this->link_id);

                $row    = mysql_fetch_assoc($result);

 

                if ($dbhost != '.' && strtolower($dbhost) != 'localhost:3306' && $dbhost != '127.0.0.1:3306')

                {

                    $this->timeline = $this->starttime - $row['timeline'];

                }

 

                if (PHP_VERSION >= '5.1' && date_default_timezone_get() == 'UTC')

                {

                    $this->timezone = $this->starttime - $row['timezone'];

                }

            }

 

            $content = '<' . "?php\r\n" .

                       '$this->mysql_config_cache_file_time = ' . $this->starttime . ";\r\n" .

                       '$this->timeline = ' . $this->timeline . ";\r\n" .

                       '$this->timezone = ' . $this->timezone . ";\r\n" .

                       '$this->platform = ' . "'" . $this->platform . "';\r\n?" . '>';

 

            @file_put_contents($sqlcache_config_file, $content);

        }

 

        /* 选择数据库 */

        if ($dbname)

        {

            if (mysql_select_db($dbname, $this->link_id) === false )

            {

                if (!$quiet)

                {

                    $this->ErrorMsg("Can't select MySQL database!");

                }

 

                return false;

            }

            else

            {

                return true;

            }

        }

        else

        {

            return true;

        }

    }

 

    ......

 

    /* 删除失败连接*/

    function del_error_link(){

        unset($this->config['master'][$this->settings['sid']]);

        $this->set_config($this->config);

        $dbhost = $this->settings['dbhost'];

        $dbuser = $this->settings['dbuser'];

        $dbpw = $this->settings['dbpw'];

        $dbname = $this->settings['dbname'];

        $this->connect($dbhost, $dbuser, $dbpw, $dbname);

    }

}

--------------------- 

作者:very_loong 


原文:https://blog.csdn.net/very_loong/article/details/7999895 



评论(0)

最新评论

  • stussy crop top

    Hey! I just wanted to ask if you ever have any trouble with hackers? My last blog (wordpress) was hacked and I ended up losing a few months of hard work due to no backup. Do you have any solutions to prevent hackers?

  • seo packages london

    %%

  • Husky-reps yupoo password

    Heya i'm for the first time here. I came across this board and I to find It truly useful & it helped me out much. I am hoping to present something back and aid others such as you helped me.

  • Umkao yupoo password

    Hi there are using Wordpress for your site platform? I'm new to the blog world but I'm trying to get started and set up my own. Do you require any coding expertise to make your own blog? Any help would be really appreciated!

  • Diagmond Store Around World

    Hello, i read your blog occasionally and i own a similar one and i was just curious if you get a lot of spam responses? If so how do you prevent it, any plugin or anything you can advise? I get so much lately it's driving me insane so any support is very much appreciated.

  • Blessed Store Official

    Everyone loves what you guys are usually up too. This sort of clever work and coverage! Keep up the wonderful works guys I've incorporated you guys to my own blogroll.

  • Bins Store

    I could not refrain from commenting. Perfectly written!

  • Typecho

    欢迎加入 Typecho 大家族

日历

2022年08月

 123456
78910111213
14151617181920
21222324252627
28293031   

标签云

文章目录

推荐关键字:

配色方案