用PHP寫的基于Memcache的Queue實(shí)現(xiàn)代碼
更新時(shí)間:2011年11月27日 17:06:32 作者:
用PHP寫的基于Memcache的Queue實(shí)現(xiàn)代碼,需要的朋友可以參考下。
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);//添加數(shù)據(jù)到隊(duì)列
MQ::add($key, $value);//添加數(shù)據(jù)到隊(duì)列
MQ::add($key, $value);//添加數(shù)據(jù)到隊(duì)列
MQ::add($key, $value);//添加數(shù)據(jù)到隊(duì)列
MQ::add($key, $value);//添加數(shù)據(jù)到隊(duì)列
MQ::add($key, $value);//添加數(shù)據(jù)到隊(duì)列
MQ:get($key, 10);//取出一定數(shù)量的數(shù)據(jù)
復(fù)制代碼 代碼如下:
<?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();
?>
使用方法
復(fù)制代碼 代碼如下:
MQ::setupMq('127.0.0.1','11211');//連接
MQ::add($key, $value);//添加數(shù)據(jù)到隊(duì)列
MQ::add($key, $value);//添加數(shù)據(jù)到隊(duì)列
MQ::add($key, $value);//添加數(shù)據(jù)到隊(duì)列
MQ::add($key, $value);//添加數(shù)據(jù)到隊(duì)列
MQ::add($key, $value);//添加數(shù)據(jù)到隊(duì)列
MQ::add($key, $value);//添加數(shù)據(jù)到隊(duì)列
MQ:get($key, 10);//取出一定數(shù)量的數(shù)據(jù)
相關(guān)文章
一個(gè)PHP數(shù)組應(yīng)該有多大的分析
PHP在數(shù)組處理上非常低效,尤其是內(nèi)存占用較多,常常使得httpd進(jìn)程消耗太多資源。2009-07-07PHP基于ffmpeg實(shí)現(xiàn)轉(zhuǎn)換視頻,截圖及生成縮略圖的方法
這篇文章主要介紹了PHP基于ffmpeg實(shí)現(xiàn)轉(zhuǎn)換視頻,截圖及生成縮略圖的方法,涉及php使用ffmpeg針對(duì)視頻文件的截圖、生成縮略圖等相關(guān)操作技巧,需要的朋友可以參考下2017-08-08php cookie的操作實(shí)現(xiàn)代碼(登錄)
cookie 常用于識(shí)別用戶。cookie 是服務(wù)器留在用戶計(jì)算機(jī)中的小文件。每當(dāng)相同的計(jì)算機(jī)通過(guò)瀏覽器請(qǐng)求頁(yè)面時(shí),它同時(shí)會(huì)發(fā)送 cookie。通過(guò) PHP,您能夠創(chuàng)建并取回 cookie 的值。2010-12-12用sql命令修改數(shù)據(jù)表中的一個(gè)字段為非空(not null)的語(yǔ)句
今天群里的一個(gè)朋友問(wèn)如何用sql命令修改數(shù)據(jù)表中的一個(gè)字段為非空(not null),經(jīng)常測(cè)試下面的代碼即可。2010-06-06PHP/ThinkPHP實(shí)現(xiàn)批量打包下載文件的方法示例
最近因?yàn)楣ぷ鞯男枰?,要根?jù)條件自動(dòng)打包供下載的功能,查找相關(guān)資料終于解決了,所以下面這篇文章主要給大家介紹了利用PHP或者ThinkPHP如何實(shí)現(xiàn)批量打包下載文件的方法示例,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-07-07php array_chunk()函數(shù)用法與注意事項(xiàng)
這篇文章主要介紹了php array_chunk()函數(shù)用法與注意事項(xiàng),結(jié)合實(shí)例形式分析了php數(shù)組分割函數(shù)array_chunk()相關(guān)功能、用法及操作注意事項(xiàng),需要的朋友可以參考下2019-07-07PHP基于GD庫(kù)實(shí)現(xiàn)的生成圖片縮略圖函數(shù)示例
這篇文章主要介紹了PHP基于GD庫(kù)實(shí)現(xiàn)的生成圖片縮略圖函數(shù),涉及php針對(duì)圖片屬性相關(guān)操作技巧,需要的朋友可以參考下2017-07-07