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的版本沒多大關係~ 下載之後我們先來配置好環境變數: 在我們的系統變數中增加上