首頁  >  文章  >  後端開發  >  php分散式部署實例詳解

php分散式部署實例詳解

小云云
小云云原創
2018-03-12 11:29:422481瀏覽

普通的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,增加設定項目:

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

  修改資料快取為Memcache:

'DATA_CACHE_TYPE'
       => 
'Memcache'
,


  1.   修改Session為Memcache:

#

'SESSION_TYPE'          => 'Memcache',

  如下圖所示:

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

    <?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();  
        }  
    }

    ##  附件2:SessionMemcache.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;  
    }  
}  
?>

相關推薦:

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

hadoop 2.6.0 偽分散式部署安裝的實例教學

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

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

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