1. 程式人生 > >ThinkPHP專案實現分散式部署(網站叢集)

ThinkPHP專案實現分散式部署(網站叢集)

  普通的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',

  如下圖所示:


  因為雲端儲存各類比較多,附件儲存到雲端儲存上,就不再贅述,引數各雲端儲存提供的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 <
[email protected]
> // +---------------------------------------------------------------------- defined('THINK_PATH') or exit(); /** * Memcache快取驅動 * @category Extend * @package Extend * @subpackage Driver.Cache * @author liu21st <[email protected]> */ class CacheMemcache extends Cache { /** * 架構函式 * @param array $options 快取引數 * @access public */ function __construct($options=array()) { if ( !extension_loaded('memcache') ) { throw_exception(L('_NOT_SUPPERT_').':memcache'); } $options = array_merge(array ( 'host' => C('MEMCACHE_HOST') ? C('MEMCACHE_HOST') : '127.0.0.1', 'port' => C('MEMCACHE_PORT') ? C('MEMCACHE_PORT') : 11211, 'timeout' => C('DATA_CACHE_TIMEOUT') ? C('DATA_CACHE_TIMEOUT') : false, 'persistent' => false, ),$options); $this->options = $options; $this->options['expire'] = isset($options['expire'])? $options['expire'] : C('DATA_CACHE_TIME'); $this->options['prefix'] = isset($options['prefix'])? $options['prefix'] : C('DATA_CACHE_PREFIX'); $this->options['length'] = isset($options['length'])? $options['length'] : 0; $func = $options['persistent'] ? 'pconnect' : 'connect'; $this->handler = new Memcache; $options['timeout'] === false ? $this->handler->$func($options['host'], $options['port']) : $this->handler->$func($options['host'], $options['port'], $options['timeout']); } /** * 讀取快取 * @access public * @param string $name 快取變數名 * @return mixed */ public function get($name) { N('cache_read',1); return $this->handler->get($this->options['prefix'].$name); } /** * 寫入快取 * @access public * @param string $name 快取變數名 * @param mixed $value 儲存資料 * @param integer $expire 有效時間(秒) * @return boolen */ public function set($name, $value, $expire = null) { N('cache_write',1); if(is_null($expire)) { $expire = $this->options['expire']; } $name = $this->options['prefix'].$name; if($this->handler->set($name, $value, 0, $expire)) { if($this->options['length']>0) { // 記錄快取佇列 $this->queue($name); } return true; } return false; } /** * 刪除快取 * @access public * @param string $name 快取變數名 * @return boolen */ public function rm($name, $ttl = false) { $name = $this->options['prefix'].$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 <[email protected]>
// +----------------------------------------------------------------------
    /**
     * 自定義Memcache來儲存session
     */
Class SessionMemcache{
    //memcache物件
    private $mem;
    //SESSION有效時間
    private $expire;
    //外部呼叫的函式
    public function execute(){
        session_set_save_handler(
            array(&$this,'open'), 
            array(&$this,'close'), 
            array(&$this,'read'), 
            array(&$this,'write'), 
            array(&$this,'destroy'), 
            array(&$this,'gc')
            );
    }
    //連線memcached和初始化一些資料
    public function open($path,$name){
        $this->expire = C('SESSION_EXPIRE') ? C('SESSION_EXPIRE') :ini_get('session.gc_maxlifetime');
        $this->mem = new Memcache;
        return $this->mem->connect(C('MEMCACHE_HOST'), C('MEMCACHE_PORT'));
    }
    //關閉memcache伺服器
    public function close(){
        return $this->mem->close();
    }
    //讀取資料
    public function read($id){
        $id = C('SESSION_PREFIX').$id;
        $data = $this->mem->get($id);
        return $data ? $data :'';
    }
    //存入資料
    public function write($id,$data){
        $id = C('SESSION_PREFIX').$id;
        //$data = addslashes($data);
        return $this->mem->set($id,$data,0,$this->expire);
    }
    //銷燬資料
    public function destroy($id){
        $id = C('SESSION_PREFIX').$id;
        return $this->mem->delete($id);
    }
    //垃圾銷燬
    public function gc(){
        return true;
    }
}
?>

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



相關推薦

ThinkPHP專案實現分散式部署網站叢集

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

docker簡易環境搭建實戰篇:以人人網開源專案renren-fast-vue搭建分散式部署前端篇

docker簡易環境搭建實戰篇:以人人網開源專案(renren-fast-vue)搭建分散式部署(前端篇) 寫在前面:注:閱讀本文前,請先閱讀docker標籤的docker簡易系列的文章。 前端最終實現的架構圖: 第一步 修改前端專案配置 修改專案目錄中 static/co

基於Jenkins,docker實現自動化部署持續交付

前言 隨著業務的增長,需求也開始增多,每個需求的大小,開發週期,釋出時間都不一致。基於微服務的系統架構,功能的疊加,對應的服務的數量也在增加,大小功能的快速迭代,更加要求部署的快速化,智慧化。因此,傳統的人工部署已經心有餘而力不足。持續整合,持續部署,持續互動對於微服務開發來說,是提高團隊整體效率不可或缺的

大眾點評 cat 專案訪問監控 部署windows環境

1、直接下載zip壓縮包 專案下載 : https://github.com/dianping/cat 需要本地執行cat專案,作為伺服器,在執行的伺服器中檢視客戶端(需要被監控的專案)的訪問情況。下載的專案解壓縮後  script目錄下有“Cat技術入門總結-0.1.0.

Jenkins,docker實現自動化部署持續互動

laiyuan:https://www.cnblogs.com/bigben0123/p/7886092.html 前言 隨著業務的增長,需求也開始增多,每個需求的大小,開發週期,釋出時間都不一致。基於微服務的系統架構,功能的疊加,對應的服務的數量也在增加,大小功能的快速迭代,更加要求部署的

docker 實現自動化部署springboot+mysql

這個自動化部署是通過 git+daocloud 來實現的  (都是坑啊 一直連不上資料庫  發現是ip的原因)1、在伺服器上安裝docker(1)安裝需要的包yum install -y yum-utils \device-mapper-persistent-data \ 

基於Jenkins,docker實現自動化部署持續互動

前言隨著業務的增長,需求也開始增多,每個需求的大小,開發週期,釋出時間都不一致。基於微服務的系統架構,功能的疊加,對應的服務的數量也在增加,大小功能的快速迭代,更加要求部署的快速化,智慧化。因此,傳統的人工部署已經心有餘而力不足。持續整合,持續部署,持續互動對於微服務開發來說

.NET Core微服務之基於Jenkins+Docker實現持續部署Part 1

一、CI, CD 與Jenkins   網際網路軟體的開發和釋出,已經形成了一套標準流程,最重要的組成部分就是持續整合(Continuous integration,簡稱 CI) => 持續整合指的是,頻繁地(一天多次)將程式碼整合到主幹。   它的好處主要有兩個: 快速發現錯

docker簡易環境搭建實戰篇:以人人網開源專案renren-fast搭建分散式部署後端篇

docker簡易環境搭建實戰篇:以人人網開源專案(renren-fast)搭建分散式部署(後端篇) 寫在前面:注:閱讀本文前,請先閱讀docker標籤的docker簡易系列的文章。 後端最終實現的架構圖: 第一步 簡單瞭解人人開源專案renren-fast 官網:h

eclipse mavenWeb專案真正實現部署修改java程式碼和頁面檔案不用重啟tomcat

        1.前言   先說熱部署的含義:   熱部署原來被定義為:tomcat啟動後,如果你往webapps目錄下,新增新的專案,tomcat會實現自動將其釋出的功能,這時,就叫做熱部署。   網上所實現的熱部署

分散式叢集部署備忘

https://blog.csdn.net/l1028386804/article/details/72354649?utm_source=blogxgwz0 地址裡面有。 多個provider 多個consumer 多個zk dubbo.xml 中provider 的port不用修改,因為多個

Redis實現分散式spring定時任務叢集應用Redis分散式

         之前2片文章介紹了 描述:              不管用不用動態執行,單機服務都是沒有問題的,但是如果服務是叢集模式下,那麼一個任務在每臺機器都會執行一次,這肯定不是我們需要的,我們要實現的是整個叢集每次只有一個任務執行成功,但是spring

搭建redis叢集實現分散式快取

redis是一個高階快取,使用到redis作為我們專案的快取,所以就花了一天時間研究了一下redis的一些用法,因為沒轉linux虛擬機器,所以就決定先研究一下windows版本的redis叢集。主要是redis叢集的皮毛:   1.首先下載windows版本的redis:https://github.co

搭建redis叢集實現分散式快取

第一篇那redis的基礎命令都差不多講了一遍了,這篇就將怎麼配置叢集了,最後要達到的效果是一臺主redis,還有幾臺從的redis,每次資料都是同步的,當主redis掛掉了,那麼就會從幾臺從redis挑選出一臺作為主的redis,如果之後剛開始的主redis啟動以後,又會變為剛開始的狀態,   因為要做叢集

hadoop3.1.0 HA高可用完全分散式叢集的安裝部署詳細教程

1.環境介紹 伺服器環境:CentOS 7 5臺伺服器 兩臺namenode 三臺datanode 節點 IP NN DN ZK ZKFC

專案案例:部署社交網站svn伺服器全面過程

案例需求:社交網站採用PHP語言開發,為了管理開發程式碼,搭建SVN伺服器進行版本控制,社交網站的第一個版本部署在LNMP平臺上,前端為nginx伺服器,通過fastcgi協議訪問後端的PHP伺服器。這裡實現動靜分離,動態頁面交給PHP伺服器來處理,靜態頁面交給nginx伺服

Linux-7.2下使用Tomcat-8.5實現專案部署終極一般

《 Linux-7.2下使用Tomcat-8.5實現專案熱部署 》 關於 Tomcat 的熱部署在 Tomcat 中部署 Java 專案,如果專案較大時,啟動 Tomcat 會非常慢,如此就

容器+AOP實現動態部署

集合 tar details class 處理 tid ret con sta 上節咱們談到容器的基本特性,這次繼續說容器怎樣與AOP進行結合。增強咱們的對象。為對象加入額外的方法。 咱們下面方圖為說明 業務對象通過busi

Jetty插件實現部署開發時修改文件自動重啟Jetty

max www. nbsp 很遺憾 pom als ati mave 重啟 在pom.xml文件中配置Jetty插件的參數:scanIntervalSeconds <plugin> <grou

2、Tomcat叢集,並用Nginx實現負載均衡win環境

1、Tomcat的配置 1、系統環境變數配置: 首先要實現Tomcat的叢集就得擁有多個tomcat,所以我在本地電腦下載了兩個Tomcat,我這裡使用的是Tomcat7,當然,配置與Tomcat的版本沒多大關係~ 下載之後我們先來配置好環境變數: 在我們的系統變數中增加上