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

<?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('THINK_PATH') 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('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. <?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,'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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

797

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

272

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

144

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

25

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

92

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

53

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

15

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

717

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

64

2026.02.12

热门下载

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

精品课程

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

共18课时 | 5.9万人学习

Git 教程
Git 教程

共21课时 | 3.7万人学习

Excel 教程
Excel 教程

共162课时 | 18.2万人学习

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

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