用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连接Oracle for NT 远程数据库
Oct 09 PHP
一个简单的MySQL数据浏览器
Oct 09 PHP
PHP mail()函数使用及配置方法
Jan 14 PHP
php中unserialize返回false的解决方法
Sep 22 PHP
php通过function_exists检测函数是否存在的方法
Mar 18 PHP
php简单实现快速排序的方法
Apr 04 PHP
WordPress的文章自动添加关键词及关键词的SEO优化
Mar 01 PHP
php单例模式的简单实现方法
Jun 10 PHP
PHP接口并发测试的方法(推荐)
Dec 15 PHP
PHP使用finfo_file()函数检测上传图片类型的实现方法
Apr 18 PHP
PHP读取CSV大文件导入数据库的实例
Jul 24 PHP
PHP设计模式之工厂模式实例总结
Sep 01 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
叶罗丽:为什么大家对颜冰这对CP非常关心,却对金茉两人十分冷漠
2020/03/17 国漫
239军机修复记
2021/03/02 无线电
PHP设计聊天室步步通
2006/10/09 PHP
PHP使用mkdir创建多级目录的方法
2015/12/22 PHP
php实现带读写分离功能的MySQL类完整实例
2016/07/28 PHP
你需要知道的JavsScript可以做什么?
2007/06/29 Javascript
走出JavaScript初学困境—js初学
2008/12/29 Javascript
基于jQuery的合并表格中相同文本的相邻单元格的代码
2011/04/06 Javascript
javascript学习笔记(十五) js间歇调用和超时调用
2012/06/20 Javascript
Jvascript学习实践案例(开发常用)
2012/06/25 Javascript
JS 获取浏览器和屏幕宽高等信息的实现思路及代码
2013/07/31 Javascript
jQuery中insertAfter()方法用法实例
2015/01/08 Javascript
JavaScript面对国际化编程时的一些建议
2015/06/24 Javascript
老生常谈javascript的类型转换
2016/10/12 Javascript
AngularJS之自定义服务详解(factory、service、provider)
2017/04/14 Javascript
Node.js利用断言模块assert进行单元测试的方法
2017/09/28 Javascript
完美解决手机网页中输入框被输入法遮挡的问题
2017/12/19 Javascript
React组件中的this的具体使用
2018/02/28 Javascript
JS实现同一DOM元素上onClick事件与onDblClick事件并存的解决方法
2018/06/07 Javascript
vue-cli 3 全局过滤器的实例代码详解
2019/06/03 Javascript
解决layui批量传值到后台操作时出现传值为空的问题
2019/09/28 Javascript
vue项目中使用bpmn-自定义platter的示例代码
2020/05/11 Javascript
微信小程序学习总结(五)常见问题实例小结
2020/06/04 Javascript
vue-video-player视频播放器使用配置详解
2020/10/23 Javascript
利用JavaScript为句子加标题的3种方法示例
2021/01/05 Javascript
[46:43]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第三局
2016/02/28 DOTA
Python编程中的反模式实例分析
2014/12/08 Python
如何在Django中添加没有微秒的 DateTimeField 属性详解
2019/01/30 Python
python 堆和优先队列的使用详解
2019/03/05 Python
使用Python中的reduce()函数求积的实例
2019/06/28 Python
使用Django搭建web服务器的例子(最最正确的方式)
2019/08/29 Python
python mqtt 客户端的实现代码实例
2019/09/25 Python
浅谈amaze-ui中datepicker和datetimepicker注意的几点
2020/08/21 HTML / CSS
优秀党员主要事迹
2014/01/19 职场文书
股权投资意向书
2014/04/01 职场文书
退伍军人感言
2015/08/01 职场文书