Home > Article > Backend Development > A detailed discussion of PHP distributed deployment
In this article, we will share with you PHP distributed deployment, hoping that everyone will have a clearer idea about PHP distributed deployment.
In ordinary Web development, the common mode is that after the user logs in, the login status information is stored in the Session, some of the user's commonly used hot data is stored in the file cache, and the attachment information uploaded by the user is stored in a certain location of the Web server. on a directory. This method is very convenient to use and fully capable for general Web applications. But for high-concurrency enterprise-level websites, it cannot handle it. Web clusters need to be used to achieve load balancing.
After deploying using the Web cluster method, the first thing to adjust is the user status information and attachment information. User status can no longer be saved to the Session, the cache cannot use the file cache of the local Web server, and attachments cannot be saved on the Web server. Because it is necessary to ensure that the status of each web server in the cluster is completely consistent. Therefore, user status, cache, etc. need to be saved to a dedicated cache server, such as Memcache. Attachments need to be saved to cloud storage, such as Qiniu Cloud Storage, Alibaba Cloud Storage, Tencent Cloud Storage, etc.
This article takes the ThinkPHP development framework as an example to explain how to set up and save Session, cache, etc. to the Memcache cache server.
Download the cached Memcache processing class and place it in the Thinkphp\Extend\Driver\Cache directory; download the Session Memcache processing class and place it in the Thinkphp\Extend\Driver\Session directory. As shown in the figure below:
view plain copy
=> '192.168.202.20',
## Modify the data cache to Memcache:
[php] view plain copy
##'DATA_CACHE_TYPE' => 'Memcache' ,
=> 'Memcache' ,
## Attachment 1: CacheMemcache.class.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 // +---------------------------------------------------------------------- defined('THINK_PATH') or exit (); ##/** ## * Memcache cache driver * @category Extend
extends Cache { * Architectural function ## * @param array $options Cache parameters * @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 ']) : ## ##$func($options['host'], $options['port'], $options[' timeout']); ## } /** ## * Read cache ## * @access public * @param string $name cache variable name ## * @return mixed ## */ function get( $name) { ,1 ; handler->get($this->options['prefix' $name ); ## } # # * @access public * @param string $name Cache variable name ## * @param mixed $value Stored data
* @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;
}
/**
## * Delete cache
* @access public
## * @param string $name cache variable name
* @return boolen
function rm($name, $ttl = false) {
= $this->options['prefix'].$name;
return $ttl === false ?
$this->handler->delete($name) :
$this->handler->delete($name, $ttl);
}
/**
* clear cache
* @access public
# * @return boolen
*/
public function clear() {
return $this->handler->flush();
}
}
附件2:SessionMemcache.class.php
[php] view plain copy
// +----------------------------------------------------------------------
// |
// +----------------------------------------------------------------------
// | Copyright (c) 2013-
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +-------------------------------- -------------------------------------
##// | Author: richievoe
##// +----------------------------------- ----------------------------------
## Class SessionMemcache{
##//memcache object
private
$mem; #//SESSION valid time
##private
; ##//Externally called functions
public function execute(){
session_set_save_handler(
array(&$this,'open'),
array(&$this,'close'),
array(&$this,'read'),
array(&$this,'write'),
array(&$this,'destroy'), ,
'gc'# ## } } ## //Connect memcached and initialize some data
public
open($ path,$name
## $this ->expire = C('SESSION_EXPIRE') ? C('SESSION_EXPIRE') :ini_get
();
## # return $this
->mem->connect(C(), C('MEMCACHE_PORT')); }
//Close memcache server
public function
close(){## }
//Read data public
function read(
){
$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);
## }
//Garbage destruction
## public function gc(){
# true; ## }
}
?>
#Related recommendations:
PHP distributed tracing experience sharing
Issues related to PHP distributed and large-scale data processing
php distributed architectureThe above is the detailed content of A detailed discussion of PHP distributed deployment. For more information, please follow other related articles on the PHP Chinese website!