PHP+CI框架+Memcache集成
一、目录结构
二、具体代码
MemcacheCluster.php
- <?php
- /**
- * 一致性哈希memcache分布式,采用的是虚拟节点的方式解决分布均匀性问题,查找节点采用二分法快速查找
- */
- class MemcacheCluster
- {
- private $_node = array();
- private $_nodeData = array();
- private $_keyNode = 0;
- private $_memcache = null;
- //每个物理服务器生成虚拟节点个数 [注:节点数越多,cache分布的均匀性越好,同时set get操作时,也更耗资源,10台物理服务器,采用200较为合理]
- private $_virtualNodeNum = 2;
- private function __construct()
- {
- /* 放入配置文件 */
- $config = array(
- '127.0.0.1:11211',
- );
- if (!$config) throw new Exception('Cache config NULL');
- foreach ($config as $key => $value) {
- for ($i = 0; $i < $this->_virtualNodeNum; $i++) {
- $this->_node[sprintf("%u", crc32($value . '_' . $i))] = $value . '_' . $i;
- }
- }
- ksort($this->_node);
- }
- private function __clone()
- {
- }
- /**
- * 单例,保证只有一个实例
- */
- static public function getInstance()
- {
- static $memcacheObj = null;
- if (!is_object($memcacheObj)) {
- $memcacheObj = new self();
- }
- return $memcacheObj;
- }
- /**
- * 根据key做一致性hash后连接到一台物理memcache服务器
- * @param string $key
- */
- private function _connectMemcache($key)
- {
- $this->_nodeData = array_keys($this->_node);
- $this->_keyNode = sprintf("%u", crc32($key));
- $nodeKey = $this->_findServerNode();
- //如果超出环,从头再用二分法查找一个最近的,然后环的头尾做判断,取最接近的节点
- if ($this->_keyNode > end($this->_nodeData)) {
- $this->_keyNode -= end($this->_nodeData);
- $nodeKey2 = $this->_findServerNode();
- if (abs($nodeKey2 - $this->_keyNode) < abs($nodeKey - $this->_keyNode)) $nodeKey = $nodeKey2;
- }
- //var_dump($this->_node[$nodeKey]); 127.0.0.1:11211_20
- list($config, $num) = explode('_', $this->_node[$nodeKey]);
- if (!$config) throw new Exception('Cache config Error');
- if (!isset($this->_memcache[$config])) {
- $this->_memcache[$config] = new Memcache;
- list($host, $port) = explode(':', $config);
- $this->_memcache[$config]->connect($host, $port);
- }
- return $this->_memcache[$config];
- }
- /**
- * 采用二分法从虚拟memcache节点中查找最近的节点
- * @param unknown_type $m
- * @param unknown_type $b
- */
- private function _findServerNode($m = 0, $b = 0)
- {
- $total = count($this->_nodeData);
- if ($total != 0 && $b == 0) $b = $total - 1;
- if ($m < $b) {
- $avg = intval(($m + $b) / 2);
- if ($this->_nodeData[$avg] == $this->_keyNode) return $this->_nodeData[$avg];
- elseif ($this->_keyNode < $this->_nodeData[$avg] && ($avg - 1 >= 0)) return $this->_findServerNode($m, $avg - 1);
- else return $this->_findServerNode($avg + 1, $b);
- }
- if (abs($this->_nodeData[$b] - $this->_keyNode) < abs($this->_nodeData[$m] - $this->_keyNode)) return $this->_nodeData[$b];
- else return $this->_nodeData[$m];
- }
- public function set($key, $value, $expire = 0)
- {
- return $this->_connectMemcache($key)->set($key, json_encode($value), 0, $expire);
- }
- public function add($key, $value, $expire = 0)
- {
- return $this->_connectMemcache($key)->add($key, json_encode($value), 0, $expire);
- }
- public function get($key)
- {
- return json_decode($this->_connectMemcache($key)->get($key), true);
- }
- public function delete($key)
- {
- return $this->_connectMemcache($key)->delete($key);
- }
- }
memcached.php
- <?php
- /**
- * Created by PhpStorm.
- * User: 25754
- * Date: 2019/9/17
- * Time: 16:17
- */
- include_once APPPATH . "/third_party/MemcacheCluster.php";
- class Memcached
- {
- public function set($key, $value, $expire = 0)
- {
- return MemcacheCluster::getInstance()->set($key, $value, $expire);
- }
- public function add($key, $value, $expire = 0)
- {
- return MemcacheCluster::getInstance()->add($key, $value, $expire);
- }
- public function delete($key)
- {
- return MemcacheCluster::getInstance()->delete($key);
- }
- public function get($key)
- {
- return MemcacheCluster::getInstance()->get($key);
- }
- }
MY_Controller.php
- class Home_Controller extends CI_Controller
- {
- public function __construct()
- {
- parent::__construct();
- $this->load->library('memcached', null, 'memcache');
- }
- }
index.php
- class Index extends Home_Controller
- {
- public function __construct()
- {
- parent::__construct();
- $this->load->set_home_view_dir();
- }
- public function index()
- {
- //要设置随机缓存时间,防止缓存失效,大的访问量造成数据库崩溃
- $time = rand(1, 10);
- $key = md5("yy");
- $cacheValue = $this->memcache->get($key);
- if (!$cacheValue) {
- //随机保存时间
- $flag = $this->memcache->set($key, "yang", $time);
- if ($flag) {
- echo "缓存时间:".$time."秒";
- }
- }
- echo $cacheValue;
- }
- }
PHP+CI框架+Memcache集成的更多相关文章
- CI框架中集成CKEditor编辑器的教程
CKEditor是在很多开发过程中都会用到的一个富文本编辑器,那么如何在CI框架中使用它呢?这里介绍了在CI下使用CKEditor的方法,版本比较低,是在CI 1.7.3下使用fckeditor 2. ...
- 【军哥谈CI框架】之CI中集成百度UEditor
Hello,各位亲,新的一周来临啦,很高兴这么快又跟大家伙见面!话说上一回,军哥带大家用JQuery写了一个城市级联菜单的例子 ,不知道亲们学会了多少,是否自己可以独立写出来了呢. 军哥很是期待大家学 ...
- **【ci框架】PHP的CI框架集成Smarty的最佳方式
因为CI自带的模板功能不是很方便,所以大家普遍采用集成Smarty的方式来弥补CI这方面的不足. 本人在网上看了不少CI集成Smarty的教程,包括咱们CI论坛里面的一个精华帖子 http://cod ...
- CI框架使用PHPmail插件发送QQ邮件:
有助请顶,不好请评.0:33 2016/3/12CI框架使用PHPmail插件发送QQ邮件:发送成功,不过修改了主机参数,还包含了一个phpmail中的一个另外的文件,详见下方:参见:http://c ...
- CI框架源码阅读笔记1 - 环境准备、基本术语和框架流程
最开始使用CI框架的时候,就打算写一个CI源码阅读的笔记系列,可惜虎头蛇尾,一直没有行动.最近项目少,总算是有了一些时间去写一些东西.于是准备将之前的一些笔记和经验记录下来,一方面权作备忘,另一方面时 ...
- **【ci框架】精通CodeIgniter框架
http://blog.csdn.net/yanhui_wei/article/details/25803945 一.大纲 1.codeigniter框架的授课内容安排 2.codeigniter框架 ...
- CI框架大纲总结
一.大纲 1.codeigniter框架的授课内容安排 2.codeigniter框架的简介 |-----关于框架的概念 |-----使用CI框架的好处 |-----为什么选择CI框架 3.codei ...
- 【ci框架基础】之部署百度编辑器
在ci框架下加载编辑器,现在复习下内容.我的框架文件名称为ci 1.下载百度编辑器ueditor,http://ueditor.baidu.com/ 一般情况下下载ubuilder版即可,并将uedi ...
- PHP的CI框架流程基本熟悉
CI框架是PHP的一个快速开发框架,我是目前的公司项目后台语言用的PHP,因为我做前端开发,需要用php去填充页面数据,所以就开始去了解这个框架,学习了一些php和数据库的东西,这篇文章先具体介绍CI ...
随机推荐
- ASP.NET WEB应用程序(.network4.5)MVC 程序的结构解读1
https://www.cnblogs.com/-beauTiFul/p/8036509.html 简介 开发环境:VS2015 ASP.NET:可以开发出几乎所有运行在Windows上的应用程序:. ...
- 补充:Python安装
需要安装Python2.7.Numpy和Matplotlib.由于Python不支持向下兼容,因此在Python3.×下你一定能正常运行Python2.×的代码.上述模块最简单的安装方法就是用软件包安 ...
- Mac下安装和配置Vue项目
题记:学vue有一段时间了,终于今天下定决心每日书写一篇学习笔记.1.访问node.js官网:https://nodejs.org/en/ 下载对应安装包.2.安装完成,在终端输入 : node -v ...
- Spring中Bean的管理问题
首先,配置文件中定义的bean并不是都在启动时实例化. <bean id="accountService" class="com.foo.DefaultAccoun ...
- 用一个N点复序列的FFT同时计算两个N点实序列离散傅里叶变换
一.功能 用一个\(N\)点复序列快速傅立叶变换算法来同时计算两个\(N\)点实序列的离散傅立叶变换. 二.方法简介 假设\(x(n)\)与\(y(n)\)都是长度为\(N\)的实序列,为计算其离散傅 ...
- ajax _flask
同步访问 当客户端向服务器发送请求时,服务器在处理过程中,浏览器只能等等,效率偏低 异步访问: 当客户端向服务器发送请求时,服务器在处理过程中,客户端可以做其他的操作,不需要一直等待,效率偏高 AJA ...
- 关于Linux、python的PDF书籍整理(附带亲测的 IT 电子书网站)
[18.1.3][在博客园发的文章不是很多呢,接下来的博客会转移到独立的个人博客网站上去了,具体的学习笔记和内容都会在独立网站上发布,后期还会有博主的个人资源库和教程还有独立网盘存储(可以关注一波哈) ...
- Centos 升级至 OpenSSH 8 rpm包制作
背景 安全部门扫描系统漏洞,OpenSSH 7.9出现漏洞,需升级到8. 使用 rpmbuild 将源码包编译为 rpm包. yum install rpm-build zlib-devel open ...
- Window脚本学习笔记之BAT调用设置
用一句bat脚本调用window的系统设置: rem 调用回收站 explorer.exe ::{645FF040-5081-101B-9F08-00AA002F954E} rem 检查Windows ...
- [转]python3 跨目录模块调用,你真的懂了吗?
小伙伴们,你们有遇到过调用自己写的模块(跨目录模块调用),提示你ImportError:No module named ...的情况,如果有,而且到现在还没有搞明白的,我想说,你今天看对文章了. 这篇 ...