這裡介紹了php實現的memcache環形佇列類。沒咋學過資料結構,因為業務需要,所以只是硬著頭皮模擬的! 參考php memcache 佇列**。為使佇列隨時可入可出,且不受int長度越界危險(單鏈採取head自增的話不作處理有越界可能),所以索性改寫成環形佇列。可能還有bug,忘見諒!
<?php /**
* php memcache 環形佇列類
* 原作者 lkk/lianq.net
* 修改 foxhunter
* 因業務需要只保留的佇列中的pop和push,修改過期時間為0即永久
*/class mqueue
elseif (is_array($config)) elseif (is_string($config))
if (!self::$client)
return false;
ignore_user_abort(true); //當客戶斷開連線,允許繼續執行
set_time_limit(0); //取消指令碼執行延時上限
$this->access = false;
$this->sleeptime = 1000;
$expire = (empty($expire)) ? 0 : (int) $expire + 1;
$this->expire = $expire;
$this->queuename = $queuename;
$this->retrynum = 20000;
$this->maxnum = $maxqueue != null ? $maxqueue : 1;
$this->canrewrite = $canrewrite;
$this->getheadandtail();
if (!isset($this->head) || empty($this->head))
$this->head = 0;
if (!isset($this->tail) || empty($this->tail))
$this->tail = 0;
if (!isset($this->len) || empty($this->len))
$this->len = 0;
} //獲取佇列首尾指標資訊和長度
private function getheadandtail()
// 利用memcache_add原子性加鎖
private function lock()
}return $this->access = true;
} return false;
} //更新頭部指標指向,指向下乙個位置
private function incrhead()
;$this->len--; //head的移動由pop觸發,所以相當於數量減少
if ($this->len < 0)
; memcache_set(self::$client, $this->queuename . self::head_key, $this->head, false, $this->expire); //更新
memcache_set(self::$client, $this->queuename . self::length_key, $this->len, false, $this->expire); //更新
} //更新尾部指標指向,指向下乙個位置
private function incrtail()
;$this->len++; //head的移動由push觸發,所以相當於數量增加
if ($this->len >= $this->maxnum)
; memcache_set(self::$client, kcykuhqk$this->queuename . self::tail_key, $this->tail, false, $this->expire); //更新
memcache_set(self::$client, $this->queuename . self::length_key, $this->len, false, $this->expire); //更新
} // 解鎖
private func程式設計客棧tion unlock()
//判斷是否滿佇列
public functi isfull()
//判斷是否為空
public function isempty()
public function getlen()
/** push值
* @param mixed 值
* @return bool
*/public function push($data = '')
$this->getheadandtail(); //獲取最新指標資訊
if ($this->isfull())
if (memcache_set(self::$client, $this->queuename . self::valu_key . $this->tail, $data, memcache_compressed, $this->expire))
$this->incrtail(); //移動尾部指標
$result = true;
} $this->unlock();
return $result;
} /*
* pop乙個值
* @param [length] int 佇列長度
* @return array
*/public function pop($length = 0)
//獲取長度超出佇列長度後進行修正
if ($length > $this->len)
$length = $this->len;
$data = $this->popkeyarray($length);
$this->unlock();
return $data;
} /*
* pop某段長度的值
* @param [length] int 佇列長度
* @return array
*/private function popkeyarray($length)
else
} return $result;
} /*
* 重置佇列
* * @return null
*/private function reset($all = false)
else
} /*
* 清除所有memcache快取資料
* @return null
*/public function memflush()
public function clear($all = false)
@memcache_delete(self::$client, $this->queuename . self::valu_key . $curr, 0);
} $this->unlock();
$this->reset($all);
return true;
}}本文標題: php實現的memcache環形佇列類例項
本文位址:
通過memcache實現php的session共享
基礎環境 目前lvs負載均衡集群已經部署完畢,但是因為web伺服器的會話不一致導致電商 出現無法正常註冊賬號,無法正常結算等等問題!現在我們需要在後端安裝一台memcached伺服器用來儲存session,達到session共享,實現session一致的目的.yum y install memcac...
PHP實現約瑟夫環
題目 有17個人圍成一圈 編號0 16 從第0號的人開始從1報數,凡報到3的倍數的人離開圈子,然後再數下去,直到最後只剩下乙個人為止,問此人原來的位置是多少號?思想 1.設定陣列,把這些人按照編號存入陣列,且加乙個標記位,0代表沒有被移出,1代表移出。2.執行無限迴圈,在每一次迴圈中,對整個陣列進行...
PHP實現的memcache環形佇列類例項
這篇文章主要介紹了php實現的memcache環形佇列類,例項分析了基於memcache實現環形佇列的方法,涉及memcache快取及佇列的相關技巧,需要的朋友可以參考下 這裡介紹了php實現的memcache環形佇列類。沒咋學過資料結構,因為業務需要,所以只是硬著頭皮模擬的!參考php memca...