Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung der verteilten Bereitstellungsbeispiele des ThinkPHP-Projekts

Detaillierte Erläuterung der verteilten Bereitstellungsbeispiele des ThinkPHP-Projekts

小云云
小云云Original
2018-01-25 14:18:097409Durchsuche

Bei der normalen Webentwicklung besteht der übliche Modus darin, dass nach der Anmeldung des Benutzers die Anmeldestatusinformationen in der Sitzung gespeichert werden, einige der häufig verwendeten Hot-Daten des Benutzers im Dateicache gespeichert werden und die Anhangsinformationen von hochgeladen werden Der Benutzer wird in einem Verzeichnis auf dem Webserver gespeichert. Diese Methode ist sehr komfortabel zu verwenden und für allgemeine Webanwendungen voll geeignet. Bei Websites auf Unternehmensebene mit hoher Parallelität ist dies jedoch nicht möglich. Um einen Lastausgleich zu erreichen, müssen Webcluster verwendet werden.

Nach der Bereitstellung mit der Web-Cluster-Methode müssen zunächst die Benutzerstatusinformationen und Anhangsinformationen angepasst werden. Der Benutzerstatus kann nicht mehr in der Sitzung gespeichert werden, der Cache kann nicht den Dateicache des lokalen Webservers verwenden und die Anhänge können nicht auf dem Webserver gespeichert werden. Denn es muss sichergestellt werden, dass der Status jedes Webservers im Cluster vollständig konsistent ist. Daher müssen Benutzerstatus, Cache usw. auf einem dedizierten Cache-Server wie Memcache gespeichert werden. Anhänge müssen im Cloud-Speicher gespeichert werden, z. B. Qiniu Cloud Storage, Alibaba Cloud Storage, Tencent Cloud Storage usw.

In diesem Artikel wird am Beispiel des ThinkPHP-Entwicklungsframeworks erläutert, wie Sitzung, Cache usw. eingerichtet und auf dem Memcache-Cache-Server gespeichert werden.

Laden Sie die zwischengespeicherte Memcache-Verarbeitungsklasse herunter und platzieren Sie sie im ThinkphpExtendDriverCache-Verzeichnis. Laden Sie die Session Memcache-Verarbeitungsklasse herunter und platzieren Sie sie im ThinkphpExtendDriverSession-Verzeichnis, wie unten gezeigt:


Ändern Sie die Konfigurationsdatei, passen Sie die Sitzung und den Cache an und zeichnen Sie sie auf dem Memcache-Server auf. Öffnen Sie ThinkPHPConfconvention.php, fügen Sie Konfigurationselemente hinzu:

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

Ändern Sie den Datencache in Memcache:

    'DATA_CACHE_TYPE'       => 'Memcache',

Ändern Sie die Sitzung in Memcache:

    'SESSION_TYPE'          => 'Memcache',

Wie Wie in der Abbildung unten dargestellt. Anzeige:


Da es viele Arten von Cloud-Speicher gibt, werden Anhänge im Cloud-Speicher gespeichert, daher werde ich nicht auf Details eingehen. Parametrisieren Sie einfach das von jedem Cloud-Speicher bereitgestellte SDK. Nach den oben genannten Änderungen kann der Webserver verteilt bereitgestellt werden.

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

Anhang 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;
    }
}
?>

Nach der obigen Konfiguration können die Benutzerstatusinformationen angezeigt werden Speichern Sie die Cache-Informationen im Memcache. Sie können Lastausgleichsserver verwenden, um große Cluster zum Erstellen von Websites zu implementieren.

Verwandte Empfehlungen:

Sprechen Sie ausführlich über die verteilte PHP-Bereitstellung

MongoDB eigenständig, Master-Slave, verteilt Bereitstellung

PHP-Erweiterung Memcache verteilte Bereitstellungslösung_PHP

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der verteilten Bereitstellungsbeispiele des ThinkPHP-Projekts. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn