ecshop加速优化 读写主从分离

前两天配置好了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 



ecshop加速优化 读写主从分离
版权声明:若无特殊注明,本文皆为《 魔幻精灵 》原创,转载请保留文章出处。
本文链接:ecshop加速优化 读写主从分离 http://www.mhjl.cn/?post=162
正文到此结束

热门推荐

发表吐槽

你肿么看?

你还可以输入 250 / 250 个字

嘻嘻 大笑 可怜 吃惊 害羞 调皮 鄙视 示爱 大哭 开心 偷笑 嘘 奸笑 委屈 抱抱 愤怒 思考 日了狗

评论信息框

吃奶的力气提交吐槽中...


既然没有吐槽,那就赶紧抢沙发吧!