详谈php分布式部署

本文我们接着和大家分享php分布式部署,希望大家对php分布式部署有一个更清晰的思路。

普通的Web开发,常用的模式就是用户登录之后,登录状态信息保存在Session中,用户一些常用的热数据保存在文件缓存中,用户上传的附件信息保存在Web服务器的某个目录上。这种方式对于一般的Web应用,使用很方便,完全能够胜任。但是对于高并发的企业级网站,就应付不了了。需要采用Web集群实现负载均衡。

  使用Web集群方式部署之后,首要调整的就是用户状态信息与附件信息。用户状态不能再保存到Session中,缓存也不能用本地Web服务器的文件缓存,以及附件,也不能保存在Web服务器上了。因为要保证集群里面的各个Web服务器,状态完全一致。因此,需要将用户状态、缓存等保存到专用的缓存服务器,比如Memcache。附件需要保存到云存储中,比如七牛云存储、阿里云存储、腾讯云存储等。

  本文以ThinkPHP开发框架为例,说明如何设置,能够将Session、缓存等保存到Memcache缓存服务器上。

 

  下载缓存的Memcache处理类,放到ThinkphpExtendDriverCache目录中;下载Session的Memcache处理类,放到ThinkphpExtendDriverSession目录中,如下图所示:

详谈php分布式部署

  修改配置文件,调整Session与缓存,都记录到Memcache服务器上。打开ThinkPHPConfconvention.PHP,增加配置项:

[php] view plain copy

/* Memcache缓存设置 */  

‘MEMCACHE_HOST’         => ‘192.168.202.20’,  

‘MEMCACHE_PORT’         => 11211,  

  修改数据缓存为Memcache:

[php] view plain copy

‘DATA_CACHE_TYPE’       => ‘Memcache’,  

立即学习“PHP免费学习笔记(深入)”;

  修改Session为Memcache:

[php] view plain copy

‘SESSION_TYPE’          => ‘Memcache’,  

  如下图所示:

详谈php分布式部署

  因为云存储各类比较多,附件存储到云存储上,就不再赘述,参数各云存储提供的sdk即可。经过以上修改,就可以将Web服务器进行分布式部署了。

  附件1:CacheMemcache.class.php

[php] view plain copy

<?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缓存驱动 

 * @category   Extend 

 * @package  Extend 

 * @subpackage  Driver.Cache 

 * @author    liu21st  

 */  

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] view plain copy

<?php

// +———————————————————————-  

// |   

// +———————————————————————-  

// | Copyright (c) 2013-   

// +———————————————————————-  

// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )  

// +———————————————————————-  

// | Author: richievoe   

// +———————————————————————-  

    /** 

     * 自定义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;  

    }  

}  

?>  

相关推荐:

PHP分布式跟踪心得分享

PHP分布式及大量数据处理有关问题

php分布式架构

以上就是详谈php分布式部署的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2110936.html

(0)
上一篇 2025年2月24日 15:56:15
下一篇 2025年2月24日 15:56:39

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • ThinkPHP项目实现分布式部署实例详解

      普通的web开发,常用的模式就是用户登录之后,登录状态信息保存在session中,用户一些常用的热数据保存在文件缓存中,用户上传的附件信息保存在web服务器的某个目录上。这种方式对于一般的web应用,使用很方便,完全能够胜任。但是对于高…

    2025年2月24日
    200
  • PHP和Redis实现高并发下注册人数统计

    现在越来越多的网站开始注重统计和用户行为分析,作为网站经常使用的功能,如何让统计性能更加高,这也是我们需要考虑的事情。本篇通过redis来优化统计功能(以注册人数统计为例)。本文主要为大家分享一篇php+redis 消息队列 实现高并发下注…

    数据库 2025年2月24日
    200
  • PHP使用Redis存储session时的一个Warning定位详解

    本文主要和大家介绍了php使用redis存储session时的一个warning定位,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能帮助到大家。 1. 问题现象 系统页面刷新的时候,偶尔会报错下面的Warnning,但是不经常出现…

    数据库 2025年2月24日
    200
  • 资深程序员告诉你如今的 PHP不一样

    php在全球市场占有率非常高,仅次于java,从各个招聘网站的数据上来看php开发的职位非常多,薪资水平也非常不错。实际在中小企业、互联网创业公司php的市场地位是高于java的。 PHP从诞生到现在已经有20多年历史,从Web时代兴起到移…

    数据库 2025年2月24日
    200
  • PHP面向对象五大原则之里氏替换原则(LSP)详解

    这篇文章主要介绍了php面向对象五大原则之里氏替换原则(lsp),较为详细的分析了里氏替换原则(lsp)的概念、原理并结合实例形式分析了php里氏替换原则(lsp)的简单使用方法,需要的朋友可以参考下 本文实例讲述了PHP面向对象五大原则之…

    数据库 2025年2月24日
    200
  • 关于PHP的一些知识经验分享

    本篇文章给大家分享的内容是关于PHP面试的一些知识经验分享,有着一定的参考价值,有需要的朋友可以参考一下 cors(cross origion resource sharing)跨域资源共享,可以允许跨站请求资源。客户端需要用特定的方法去请…

    数据库 2025年2月24日
    200
  • php面试可能会被问道的技术题汇总

    这篇文章介绍的内容是关于php面试可能会被问道的技术题汇总,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 1.nginx 连接多台php的方式 2.线程和进程的区别 3.用到过的传输协议 4.yii2和yii不一样的三个点 …

    数据库 2025年2月24日
    200
  • php中抽象类和接口的区别

    这篇文章主要介绍了关于php中抽象类和接口的区别,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 抽象类和接口的区别 抽象类: 单继承,用extends关键字 可以有常量和变量属性 可以有构造方法 抽象类中方法可以使用publ…

    数据库 2025年2月24日
    200
  • php session共享到memcache

    这篇文章介绍的内容是关于php session共享到memcache ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 在php.ini中添加 ;设置保存在memcache中 session.save_handler = me…

    数据库 2025年2月24日
    200
  • 简述PHP设计模式中的适配器模式

    本篇文章主要介绍简述php设计模式中的适配器模式,感兴趣的朋友参考下,希望对大家有所帮助。 目标: 可将一个类的接口转换成客户希望的另外一个接口,使得原本不兼容的接口能够一起工作。通俗的理解就是将不同接口适配成统一的API接口。 角色: T…

    数据库 2025年2月24日
    200

发表回复

登录后才能评论