Maison  >  Article  >  développement back-end  >  Explication détaillée des exemples de déploiement distribué PHP

Explication détaillée des exemples de déploiement distribué PHP

小云云
小云云original
2018-03-12 11:29:422488parcourir

Dans le développement Web ordinaire, le mode courant est qu'une fois que l'utilisateur s'est connecté, les informations sur l'état de connexion sont stockées dans la session, certaines des données chaudes couramment utilisées par l'utilisateur sont stockées dans le cache de fichiers et les informations de pièce jointe téléchargées par l'utilisateur est stocké dans un répertoire sur le serveur Web. Cette méthode est très pratique à utiliser et entièrement adaptée aux applications Web générales. Mais pour les sites Web d’entreprise à haute concurrence, il ne peut pas le gérer. Les clusters Web doivent être utilisés pour réaliser l’équilibrage de charge.

Après le déploiement à l'aide de la méthode du cluster Web, la première chose à ajuster est les informations sur l'état de l'utilisateur et les informations sur les pièces jointes. Le statut de l'utilisateur ne peut plus être enregistré dans la session, le cache ne peut pas utiliser le cache de fichiers du serveur Web local et les pièces jointes ne peuvent pas être enregistrées sur le serveur Web. Car il faut s’assurer que l’état de chaque serveur web du cluster est totalement cohérent. Par conséquent, le statut de l'utilisateur, le cache, etc. doivent être enregistrés sur un serveur de cache dédié, tel que Memcache. Les pièces jointes doivent être enregistrées sur le stockage cloud, tel que Qiniu Cloud Storage, Alibaba Cloud Storage, Tencent Cloud Storage, etc.

Cet article prend le framework de développement ThinkPHP comme exemple pour expliquer comment configurer et enregistrer la session, le cache, etc. sur le serveur de cache Memcache.

Téléchargez la classe de traitement Memcache mise en cache et placez-la dans le répertoire ThinkphpExtendDriverCache ; téléchargez la classe de traitement Session Memcache et placez-la dans le répertoire ThinkphpExtendDriverSession, comme indiqué ci-dessous :


Modifiez le fichier de configuration, ajustez la session et le cache, et enregistrez-les sur le serveur Memcache. Ouvrez ThinkPHPConfconvention.PHP, ajoutez des éléments de configuration :

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

Modifiez le cache de données en Memcache :

'DATA_CACHE_TYPE'
       => 
'Memcache'
,


Modifier la session vers Memcache :

  1. 'SESSION_TYPE'          => 'Memcache',

Comme indiqué ci-dessous :


Comme il existe de nombreux types de stockage cloud, les pièces jointes sont stockées sur le stockage cloud, je n'entrerai donc pas dans les détails, il suffit de paramétrer le SDK fourni par chaque stockage cloud. Après les modifications ci-dessus, le serveur Web peut être déployé de manière distribuée.

Pièce jointe 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();  
    }  
}

Pièce jointe 2 : SessionMemcache.class .php

  1. <?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;  
        }  
    }  
    ?>

Recommandations associées :

Explication détaillée des exemples de déploiement distribué du projet ThinkPHP

Tutoriel d'exemple d'installation de déploiement pseudo-distribué Hadoop 2.6.0

Solution de déploiement distribué Memcache étendu PHP_PHP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn