0

0

php分布式部署实例详解

小云云

小云云

发布时间:2018-03-12 11:29:42

|

3114人浏览过

|

来源于php中文网

原创

普通的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目录中,如下图所示:

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


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

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

  修改数据缓存为Memcache:

'DATA_CACHE_TYPE'
       => 
'Memcache'
,


  修改Session为Memcache:

Difeye-敏捷的轻量级PHP框架
Difeye-敏捷的轻量级PHP框架

Difeye是一款超轻量级PHP框架,主要特点有: Difeye是一款超轻量级PHP框架,主要特点有: ◆数据库连接做自动主从读写分离配置,适合单机和分布式站点部署; ◆支持Smarty模板机制,可灵活配置第三方缓存组件; ◆完全分离页面和动作,仿C#页面加载自动执行Page_Load入口函数; ◆支持mysql,mongodb等第三方数据库模块,支持读写分离,分布式部署; ◆增加后台管理开发示例

下载
  1. 'SESSION_TYPE'          => 'Memcache',

  如下图所示:


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

  附件1:CacheMemcache.class.php

  
// +----------------------------------------------------------------------  
  
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

  1.   
    // +----------------------------------------------------------------------  
        /** 
         * 自定义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;  
        }  
    }  
    ?>

相关推荐:

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

hadoop 2.6.0 伪分布式部署安装的实例教程

PHP扩展Memcache分布式部署方案_PHP

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

11

2026.01.20

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

59

2026.01.19

java用途介绍
java用途介绍

本专题整合了java用途功能相关介绍,阅读专题下面的文章了解更多详细内容。

84

2026.01.19

java输出数组相关教程
java输出数组相关教程

本专题整合了java输出数组相关教程,阅读专题下面的文章了解更多详细内容。

38

2026.01.19

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

10

2026.01.19

xml格式相关教程
xml格式相关教程

本专题整合了xml格式相关教程汇总,阅读专题下面的文章了解更多详细内容。

13

2026.01.19

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

17

2026.01.19

微信聊天记录删除恢复导出教程汇总
微信聊天记录删除恢复导出教程汇总

本专题整合了微信聊天记录相关教程大全,阅读专题下面的文章了解更多详细内容。

157

2026.01.18

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

163

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CSS3 教程
CSS3 教程

共18课时 | 4.7万人学习

Git 教程
Git 教程

共21课时 | 2.8万人学习

Excel 教程
Excel 教程

共162课时 | 12.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号