首頁 >後端開發 >php教程 >ThinkPHP專案實現分散式部署實例詳解

ThinkPHP專案實現分散式部署實例詳解

小云云
小云云原創
2018-01-25 14:18:097430瀏覽

  普通的Web開發,常用的模式就是使用者登入之後,登入狀態資訊保存在Session中,使用者一些常用的熱資料保存在檔案快取中,使用者上傳的附件資訊會保存在Web伺服器的某個目錄上。這種方式對於一般的Web應用,使用很方便,完全能夠勝任。但是對於高併發的企業級網站,就應付不了了。需採用Web叢集實現負載平衡。

  使用Web叢集方式部署之後,首要調整的就是使用者狀態資訊與附件資訊。使用者狀態不能再儲存到Session中,快取也不能用本機Web伺服器的檔案緩存,以及附件,也不能儲存在Web伺服器上了。因為要確保叢集裡面的各個Web伺服器,狀態完全一致。因此,需要將使用者狀態、快取等保存到專用的快取伺服器,例如Memcache。附件需要保存到雲端儲存中,例如七牛雲端儲存、阿里雲端儲存、騰訊雲端儲存等。

  本文以ThinkPHP開發框架為例,說明如何設置,能夠將Session、快取等保存到Memcache快取伺服器上。

 

  下載快取的Memcache處理類,放到Thinkphp\Extend\Driver\Cache目錄中;下載Session的Memcache處理類,放到Thinkphp\Extend\Driver\Session目錄中,如下圖所示:


  修改設定文件,調整Session與快取,都記錄到Memcache伺服器上。開啟ThinkPHP\Conf\convention.php,增加設定項:

    /* Memcache缓存设置 */
    'MEMCACHE_HOST'         => '192.168.202.20',
    'MEMCACHE_PORT'         => 11211,

  修改資料快取為Memcache:

    'DATA_CACHE_TYPE'       => 'Memcache',

  修改Session為Memcache:

    'SESSION_TYPE'          => 'Memcache',

   修改Session為Memcache:

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2012 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------

defined(&#39;THINK_PATH&#39;) or exit();
/**
 * Memcache缓存驱动
 * @category   Extend
 * @package  Extend
 * @subpackage  Driver.Cache
 * @author    liu21st <liu21st@gmail.com>
 */
class CacheMemcache extends Cache {

    /**
     * 架构函数
     * @param array $options 缓存参数
     * @access public
     */
    function __construct($options=array()) {
        if ( !extension_loaded(&#39;memcache&#39;) ) {
            throw_exception(L(&#39;_NOT_SUPPERT_&#39;).&#39;:memcache&#39;);
        }

        $options = array_merge(array (
            &#39;host&#39;        =>  C(&#39;MEMCACHE_HOST&#39;) ? C(&#39;MEMCACHE_HOST&#39;) : &#39;127.0.0.1&#39;,
            &#39;port&#39;        =>  C(&#39;MEMCACHE_PORT&#39;) ? C(&#39;MEMCACHE_PORT&#39;) : 11211,
            &#39;timeout&#39;     =>  C(&#39;DATA_CACHE_TIMEOUT&#39;) ? C(&#39;DATA_CACHE_TIMEOUT&#39;) : false,
            &#39;persistent&#39;  =>  false,
        ),$options);

        $this->options      =   $options;
        $this->options[&#39;expire&#39;] =  isset($options[&#39;expire&#39;])?  $options[&#39;expire&#39;]  :   C(&#39;DATA_CACHE_TIME&#39;);
        $this->options[&#39;prefix&#39;] =  isset($options[&#39;prefix&#39;])?  $options[&#39;prefix&#39;]  :   C(&#39;DATA_CACHE_PREFIX&#39;);        
        $this->options[&#39;length&#39;] =  isset($options[&#39;length&#39;])?  $options[&#39;length&#39;]  :   0;        
        $func               =   $options[&#39;persistent&#39;] ? &#39;pconnect&#39; : &#39;connect&#39;;
        $this->handler      =   new Memcache;
        $options[&#39;timeout&#39;] === false ?
            $this->handler->$func($options[&#39;host&#39;], $options[&#39;port&#39;]) :
            $this->handler->$func($options[&#39;host&#39;], $options[&#39;port&#39;], $options[&#39;timeout&#39;]);
    }

    /**
     * 读取缓存
     * @access public
     * @param string $name 缓存变量名
     * @return mixed
     */
    public function get($name) {
        N(&#39;cache_read&#39;,1);
        return $this->handler->get($this->options[&#39;prefix&#39;].$name);
    }

    /**
     * 写入缓存
     * @access public
     * @param string $name 缓存变量名
     * @param mixed $value  存储数据
     * @param integer $expire  有效时间(秒)
     * @return boolen
     */
    public function set($name, $value, $expire = null) {
        N(&#39;cache_write&#39;,1);
        if(is_null($expire)) {
            $expire  =  $this->options[&#39;expire&#39;];
        }
        $name   =   $this->options[&#39;prefix&#39;].$name;
        if($this->handler->set($name, $value, 0, $expire)) {
            if($this->options[&#39;length&#39;]>0) {
                // 记录缓存队列
                $this->queue($name);
            }
            return true;
        }
        return false;
    }

    /**
     * 删除缓存
     * @access public
     * @param string $name 缓存变量名
     * @return boolen
     */
    public function rm($name, $ttl = false) {
        $name   =   $this->options[&#39;prefix&#39;].$name;
        return $ttl === false ?
            $this->handler->delete($name) :
            $this->handler->delete($name, $ttl);
    }

    /**
     * 清除缓存
     * @access public
     * @return boolen
     */
    public function clear() {
        return $this->handler->flush();
    }
}

 

  因為雲端儲存各類別比較多,附件儲存到雲端儲存上,就不再贅述,參數各雲端儲存提供的sdk即可。經過以上修改,就可以將Web伺服器進行分散部署了。

  附件1:CacheMemcache.class.php

<?php 
// +----------------------------------------------------------------------
// | 
// +----------------------------------------------------------------------
// | Copyright (c) 2013- 
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: richievoe <richievoe@163.com>
// +----------------------------------------------------------------------
    /**
     * 自定义Memcache来保存session
     */
Class SessionMemcache{
    //memcache对象
    private $mem;
    //SESSION有效时间
    private $expire;
    //外部调用的函数
    public function execute(){
        session_set_save_handler(
            array(&$this,&#39;open&#39;), 
            array(&$this,&#39;close&#39;), 
            array(&$this,&#39;read&#39;), 
            array(&$this,&#39;write&#39;), 
            array(&$this,&#39;destroy&#39;), 
            array(&$this,&#39;gc&#39;)
            );
    }
    //连接memcached和初始化一些数据
    public function open($path,$name){
        $this->expire = C(&#39;SESSION_EXPIRE&#39;) ? C(&#39;SESSION_EXPIRE&#39;) :ini_get(&#39;session.gc_maxlifetime&#39;);
        $this->mem = new Memcache;
        return $this->mem->connect(C(&#39;MEMCACHE_HOST&#39;), C(&#39;MEMCACHE_PORT&#39;));
    }
    //关闭memcache服务器
    public function close(){
        return $this->mem->close();
    }
    //读取数据
    public function read($id){
        $id = C(&#39;SESSION_PREFIX&#39;).$id;
        $data = $this->mem->get($id);
        return $data ? $data :&#39;&#39;;
    }
    //存入数据
    public function write($id,$data){
        $id = C(&#39;SESSION_PREFIX&#39;).$id;
        //$data = addslashes($data);
        return $this->mem->set($id,$data,0,$this->expire);
    }
    //销毁数据
    public function destroy($id){
        $id = C(&#39;SESSION_PREFIX&#39;).$id;
        return $this->mem->delete($id);
    }
    //垃圾销毁
    public function gc(){
        return true;
    }
}
?>

  附件2:SessionMemcache.class.php
rrreee

經過以上配置,就可以將使用者狀態資訊與快取資訊儲存到Memcache中。可以使用負載平衡伺服器,實現大規模叢集方式架設網站。

相關推薦:

詳談php分散式部署

#MongoDB單機, 主從, 分散式部署

PHP擴充Memcache分散式部署方案_PHP######

以上是ThinkPHP專案實現分散式部署實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn