用PHP写的基于Memcache的Queue实现代码


Posted in PHP onNovember 27, 2011

php类代码:

<?php 
class MQ{ 
public static $client; 
private static $m_real; 
private static $m_front; 
private static $m_data = array(); 
const QUEUE_MAX_NUM = 100000000; 
const QUEUE_FRONT_KEY = '_queue_item_front'; 
const QUEUE_REAL_KEY = '_queue_item_real'; 
public static function setupMq($conf) { 
self::$client = memcache_pconnect($conf); 
self::$m_real = memcache_get(self::$client, self::QUEUE_REAL_KEY); 
self::$m_front = memcache_get(self::$client, self::QUEUE_FRONT_KEY); 
if (!isset(self::$m_real) || emptyempty(self::$m_real)) { 
self::$real= 0; 
} 
if (!isset(self::$m_front) || emptyempty(self::$m_front)) { 
self::$m_front = 0; 
} 
return self::$client; 
} 
public static function add($queue, $data) { 
$result = false; 
if (self::$m_real < self::QUEUE_MAX_NUM) { 
if (memcache_add(self::$client, $queue.self::$m_real, $data)) { 
self::mqRealChange(); 
$result = true; 
} 
} 
return $result; 
} 
public static function get($key, $count) { 
$num = 0; 
for ($i=self::$m_front;$i<self::$m_front + $count;$i++) { 
if ($dataTmp = memcache_get(self::$client, $key.$i)) { 
self::$m_data[] = $dataTmp; 
memcache_delete(self::$client, $key.$i); 
$num++; 
} 
} 
if ($num>0) { 
self::mqFrontChange($num); 
} 
return self::$m_data; 
} 
private static function mqRealChange() { 
memcache_add(self::$client, self::QUEUE_REAL_KEY, 0); 
self::$m_real = memcache_increment(self::$client, self::QUEUE_REAL_KEY, 1); 
} 
private static function mqFrontChange($num) { 
memcache_add(self::$client, self::QUEUE_FRONT_KEY, 0); 
self::$m_front = memcache_increment(self::$client, self::QUEUE_FRONT_KEY, $num); 
} 
public static function mflush($memcache_obj) { 
memcache_flush($memcache_obj); 
} 
public static function Debug() { 
echo 'real:'.self::$m_real."<br>/r/n"; 
echo 'front:'.self::$m_front."<br>/r/n"; 
echo 'wait for process data:'.intval(self::$m_real - self::$m_front); 
echo "<br>/r/n"; 
echo '<pre>'; 
print_r(self::$m_data); 
echo '<pre>'; 
} 
} 
define('FLUSH_MQ',0);//CLEAN ALL DATA 
define('IS_ADD',0);//SET DATA 
$mobj = MQ::setupMq('127.0.0.1','11211'); 
if (FLUSH_MQ) { 
MQ::mflush($mobj); 
} else { 
if (IS_ADD) { 
MQ::add('user_sync', '1test'); 
MQ::add('user_sync', '2test'); 
MQ::add('user_sync', '3test'); 
MQ::add('user_sync', '4test'); 
MQ::add('user_sync', '5test'); 
MQ::add('user_sync', '6test'); 
} else { 
MQ::get('user_sync', 10); 
} 
} 
MQ::Debug(); 
?>

使用方法
MQ::setupMq('127.0.0.1','11211');//连接 
MQ::add($key, $value);//添加数据到队列 
MQ::add($key, $value);//添加数据到队列 
MQ::add($key, $value);//添加数据到队列 
MQ::add($key, $value);//添加数据到队列 
MQ::add($key, $value);//添加数据到队列 
MQ::add($key, $value);//添加数据到队列 
MQ:get($key, 10);//取出一定数量的数据
PHP 相关文章推荐
PHP脚本的10个技巧(6)
Oct 09 PHP
PHP新手上路(三)
Oct 09 PHP
php下使用SimpleXML 处理XML 文件
Feb 27 PHP
PHP读取ACCESS数据到MYSQL的代码
May 11 PHP
浅析PHP原理之变量(Variables inside PHP)
Aug 09 PHP
php生成缩略图填充白边(等比缩略图方案)
Dec 25 PHP
PHP中empty和isset对于参数结构的判断及empty()和isset()的区别
Nov 15 PHP
php 解析xml 的四种方法详细介绍
Oct 26 PHP
PHP基于自定义类随机生成姓名的方法示例
Aug 05 PHP
smarty模板的使用方法实例分析
Sep 18 PHP
调试php程序的简单步骤
Oct 04 PHP
Laravel开启跨域请求的方法
Oct 13 PHP
PHP中去除换行解决办法小结(PHP_EOL)
Nov 27 #PHP
php操作SVN版本服务器类代码
Nov 27 #PHP
支持中文的php加密解密类代码
Nov 27 #PHP
php UBB 解析实现代码
Nov 27 #PHP
PHP高自定义性安全验证码代码
Nov 27 #PHP
php中XMLHttpRequest(Ajax)不能设置自定义的Referer的解决方法
Nov 26 #PHP
Linux fgetcsv取得的数组元素为空字符串的解决方法
Nov 25 #PHP
You might like
sphinx增量索引的一个问题
2011/06/14 PHP
根据ip调用新浪api获取城市名并转成拼音
2014/03/07 PHP
PHP 正则表达式小结
2015/02/12 PHP
改进:论坛UBB代码自动插入方式
2006/12/22 Javascript
javascript showModalDialog模态对话框使用说明
2009/12/31 Javascript
初试jQuery EasyUI 使用介绍
2010/04/01 Javascript
js,jQuery 排序的实现代码,网页标签排序的实现,标签排序
2011/04/27 Javascript
javascript arguments使用示例
2014/12/16 Javascript
JS组件Bootstrap Select2使用方法详解
2020/04/17 Javascript
javascript每日必学之运算符
2016/02/16 Javascript
ECharts仪表盘实例代码(附源码下载)
2016/02/18 Javascript
javascript每日必学之循环
2016/02/19 Javascript
JavaScript闭包和范围实例详解
2016/12/19 Javascript
jquery做个日期选择适用于手机端示例
2017/01/10 Javascript
利用Node.js对文件进行重命名
2017/03/12 Javascript
three.js实现3D影院的原理的代码分析
2017/12/18 Javascript
webpack 3.X学习之多页面打包的方法
2018/09/04 Javascript
浅谈webpack SplitChunksPlugin实用指南
2018/09/17 Javascript
详解vue-router数据加载与缓存使用总结
2018/10/29 Javascript
快速了解Node中的Stream流是什么
2019/02/13 Javascript
vue2.0 获取从http接口中获取数据,组件开发,路由配置方式
2019/11/04 Javascript
vue实现浏览器全屏展示功能
2019/11/27 Javascript
[20:39]DOTA2-DPC中国联赛 正赛开幕式 1月18日
2021/03/11 DOTA
python模拟登录百度贴吧(百度贴吧登录)实例
2013/12/18 Python
python获取目录下所有文件的方法
2015/06/01 Python
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
2017/02/13 Python
视觉直观感受若干常用排序算法
2017/04/13 Python
python编写朴素贝叶斯用于文本分类
2017/12/21 Python
python实现C4.5决策树算法
2018/08/29 Python
在python里协程使用同步锁Lock的实例
2019/02/19 Python
python批量读取文件名并写入txt文件中
2020/09/05 Python
学python爬虫能做什么
2020/07/29 Python
全球500多个机场的接送服务:Suntransfers
2019/06/03 全球购物
财务检查整改报告
2014/11/06 职场文书
八年级语文教学反思
2016/03/03 职场文书
golang中的空slice案例
2021/04/27 Golang