用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+Html+缓存
Nov 25 PHP
不用mod_rewrite直接用php实现伪静态化页面代码
Oct 04 PHP
PHP的范围解析操作符(::)的含义分析说明
Jul 03 PHP
深入HTTP响应状态码速查表的详解
Jun 07 PHP
PHP错误WARNING: SESSION_START() [FUNCTION.SESSION-START]解决方法
May 04 PHP
百度工程师讲PHP函数的实现原理及性能分析(二)
May 13 PHP
PHP实现多维数组转字符串和多维数组转一维数组的方法
Aug 08 PHP
Laravel执行migrate命令提示:No such file or directory的解决方法
Mar 16 PHP
php阳历转农历优化版
Aug 08 PHP
php 判断过去离现在几年的函数(实例代码)
Nov 15 PHP
php中的异常和错误浅析
May 03 PHP
PHP查询分页的实现代码
Jun 09 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
用Simple Excel导出xls实现方法
2012/12/06 PHP
php字符集转换
2017/01/23 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
PHP抽象类基本用法示例
2018/12/28 PHP
php中的buffer缓冲区用法分析
2019/05/31 PHP
jquery remove方法应用详解
2012/11/22 Javascript
JavaScript中的Math.SQRT1_2属性使用简介
2015/06/14 Javascript
JavaScript访问字符串中单个字符的两种方法
2015/07/03 Javascript
jquery实现动静态条形统计图
2015/08/17 Javascript
js实现延时加载Flash的方法
2015/11/26 Javascript
教你一步步用jQyery实现轮播器
2016/12/18 Javascript
ES6新特性二:Iterator(遍历器)和for-of循环详解
2017/04/20 Javascript
webpack 2的react开发配置实例代码
2017/07/28 Javascript
微信小程序 websocket 实现SpringMVC+Spring+Mybatis
2017/08/04 Javascript
使用vue实现grid-layout功能实例代码
2018/01/05 Javascript
微信小程序自定义prompt组件步骤详解
2018/06/12 Javascript
vue中axios的封装问题(简易版拦截,get,post)
2018/06/15 Javascript
详解如何使用webpack打包JS
2018/06/21 Javascript
Vue封装的可编辑表格插件方法
2018/08/28 Javascript
微信小程序实现跑马灯效果
2020/10/21 Javascript
浅谈express.js框架中间件(middleware)
2019/04/07 Javascript
taro小程序添加骨架屏的实现代码
2019/11/15 Javascript
jQuery实现简易QQ聊天框
2020/02/10 jQuery
[02:18]《我与DAC》之工作人员:为了热爱DOTA2的玩家们
2018/03/28 DOTA
python得到单词模式的示例
2018/10/15 Python
使用python3构建文件传输的方法
2019/02/13 Python
CSS3实现线性渐变用法示例代码详解
2020/08/07 HTML / CSS
会计毕业生自我鉴定
2013/11/04 职场文书
采购主管的岗位职责
2013/12/17 职场文书
2014年幼儿园元旦活动方案
2014/02/13 职场文书
酒店管理专业毕业生自我鉴定
2014/09/29 职场文书
起诉状范本
2015/05/20 职场文书
朋友聚会开场白
2015/06/01 职场文书
董事长秘书工作总结
2015/08/14 职场文书
vue里使用create, mounted调用方法
2022/04/26 Vue.js
React自定义hook的方法
2022/06/25 Javascript