この記事では主にPHPのmemcacheクラス(memcache queue)の使い方を紹介していますので、必要な方は参考にしてください
。memcacheQueue.class.php
コードは以下のように表示されます。
add('1asdf');
* $obj->getQueueLength();
* $obj->read(10);
* $obj->get(8);
*/
クラス memcacheQueue{
public static $client; //memcache クライアント接続;
public $access; //キューを更新できるかどうか
private $expire; //有効期限、秒、1~2592000、つまり 30 日以内
private $sleepTime //ロック解除の待ち時間、マイクロ秒;
private $queueName //キュー名、一意の値;
private $retryNum; //再試行回数 = 10 * 理論上の同時実行数
public $currentHead //現在のチーム長の値
public $currentTail //現在の末尾の値
const MAXNUM = 20000; //キューの最大数、推奨上限は 10K
const HEAD_KEY = '_lkkQueueHead_' //キューの最初のキー
const TAIL_KEY = '_lkkQueueTail_'; //キューの末尾のキー
const VALU_KEY = '_lkkQueueValu_'; //キュー値のキー
const LOCK_KEY = '_lkkQueueLock_'; //キューのロックキー
/*** コンストラクター
* @param string $queueName キュー名
* @param int $expire 有効期限
* @param array $config memcache 設定
*
* @return
;
*/
パブリック関数 __construct($queueName ='',$expire=0,$config =''){
if(空($config)){
Self::$client = memcache_pconnect('127.0.0.1',11211);
}elseif(is_array($config)){//array('ホスト'=>'127.0.0.1','ポート'=>'11211')
self::$client = memcache_pconnect($config['host'],$config['port']);
}elseif(is_string($config)){//"127.0.0.1:11211"
$tmp =explode(':',$config);
$conf['ホスト'] = isset($tmp[0]) $tmp[0] : '127.0.0.1';
$conf['ポート'] = isset($tmp[1]) $tmp[1] : '11211';
Self::$client = memcache_pconnect($conf['host'],$conf['port']);
}
if(!self::$client) は false を返します。
ignore_user_abort(true);//クライアントが切断された場合、実行の継続を許可します
set_time_limit(0);//スクリプト実行遅延の上限を解除
$this->access = false;
$this->睡眠時間 = 1000;
$expire = 空($expire) ? 3600 : intval($expire)+1;
$this->expire = $expire;
$this->キュー名 = $キュー名;
$this->retryNum = 1000;
$this->head_key = $this->queueName . self::HEAD_KEY;
$this->tail_key = $this->queueName . self::TAIL_KEY;
$this->lock_key = $this->queueName . self::LOCK_KEY;
$this->_initSetHeadNTail();
}
/*** キューの先頭と末尾の値を初期化して設定します
*/
プライベート関数 _initSetHeadNTail(){
// 現在のキューの先頭の値
$this->currentHead = memcache_get(self::$client, $this->head_key);
if($this->currentHead === false) $this->currentHead =0;
// 現在のキューの末尾の値
$this->currentTail = memcache_get(self::$client, $this->tail_key);
if($this->currentTail === false) $this->currentTail =0;
}
/**※要素を取り出す場合はキューの先頭の値を変更します
* @param int $step ステップ値
*/
プライベート関数 _changeHead($step=1){
$this->currentHead += $step;
memcache_set(self::$client, $this->head_key,$this->currentHead,false,$this->expire);
}
/**※要素を追加する場合はキューの末尾の値を変更してください
* @param int $step ステップ値
* @param bool $reverse 反転するかどうか
* @return null
*/
プライベート関数 _changeTail($step=1, $reverse =false){
if(!$reverse){
$this->currentTail += $step;
}それ以外{
$this->currentTail -= $step;
}
memcache_set(self::$client, $this->tail_key,$this->currentTail,false,$this->expire);
}
/*** キューが空かどうか
* @return bool
*/
プライベート関数 _isEmpty(){
return (bool)($this->currentHead === $this->currentTail);
}
/*** 列はいっぱいですか?
* @return bool
*/
プライベート関数 _isFull(){
$len = $this->currentTail - $this->currentHead;
return (bool)($len === self::MAXNUM);
}
/*** キューのロック
*/
プライベート関数 _getLock(){
if($this->access === false){
while(!memcache_add(self::$client, $this->lock_key, 1, false, $this->expire) ){
usleep($this->sleepTime);
@$i++;
if($i > $this->retryNum){//尝试等待ちN次
false を返します。
壊す;
}
}
$this->_initSetHeadNTail();
$this->access = true を返します。
}
$this->アクセスを返す;
}
/*** キューのロック解除
*/
プライベート関数 _unLock(){
memcache_delete(self::$client, $this->lock_key, 0);
$this->access = false;
}
/*** 現在のキューの長さを取得します
* この長さは理論上の長さです。実際の長さはこの長さ以下になります。
* @return int
*/
パブリック関数 getQueueLength(){
$this->_initSetHeadNTail();
return intval($this->currentTail - $this->currentHead);
}
/*** キューデータを追加
* @param void $data 追加するデータ
* @return bool
*/
パブリック関数 add($data){
if(!$this->_getLock()) は false を返します。
if($this->_isFull()){
$this->_unLock();
false を返します。
}
$value_key = $this->queueName 。 self::VALU_KEY 。 strval($this->currentTail +1);
$result = memcache_set(self::$client, $value_key, $data, MEMCACHE_COMPRESSED, $this->expire);
if($result){
$this->_changeTail();
}
$this->_unLock();
$result を返します。
}
/*** キューデータの読み取り
* @param int $length 読み取る長さ (逆読み取りの場合は負の数値を使用)
* @return 配列
*/
パブリック関数 read($length=0){
if(!is_numeric($length)) は false を返します。
$this->_initSetHeadNTail();
if($this->_isEmpty()){
false を返します。
}
if(empty($length)) $length = self::MAXNUM;//すべて
$keyArr = 配列();
if($length > 0){//正向读取(从队列首向队列尾)
$tmpMin = $this->currentHead;
$tmpMax = $tmpMin + $length;
for($i= $tmpMin; $iqueueName 。 self::VALU_KEY 。 $i;
}
}else{//逆方向读取(从队列尾向队列首)
$tmpMax = $this->currentTail;
$tmpMin = $tmpMax + $length;
for($i= $tmpMax; $i >$tmpMin; $i--){
$keyArr[] = $this->queueName 。 self::VALU_KEY 。 $i;
}
}
$result = @memcache_get(self::$client, $keyArr);
$result を返します。
}
/*** キューデータの取得
* @param int $length 取得する長さ (逆読みの場合は負の数値を使用)
* @return 配列
*/
パブリック関数 get($length=0){
if(!is_numeric($length)) は false を返します。
if(!$this->_getLock()) は false を返します。
if($this->_isEmpty()){
$this->_unLock();
false を返します。
}
if(empty($length)) $length = self::MAXNUM;//すべて
$length = 整数($length);
$keyArr = 配列();
if($length > 0){//正向读取(从队列首向队列尾)
$tmpMin = $this->currentHead;
$tmpMax = $tmpMin + $length;
for($i= $tmpMin; $iqueueName 。 self::VALU_KEY 。 $i;
}
$this->_changeHead($length);
}else{//逆方向读取(从队列尾向队列首)
$tmpMax = $this->currentTail;
$tmpMin = $tmpMax + $length;
for($i= $tmpMax; $i >$tmpMin; $i--){
$keyArr[] = $this->queueName 。 self::VALU_KEY 。 $i;
}
$this->_changeTail(abs($length), true);
} $result = @memcache_get(self::$client, $keyArr);
foreach($keyArr as $v){//取出之后删除
@memcache_delete(self::$client, $v, 0);
}
$this->_unLock();
$result を返します。
}
/*** キューをクリアする
*/
パブリック関数clear(){
if(!$this->_getLock()) は false を返します。
if($this->_isEmpty()){
$this->_unLock();
false を返します。
}
$tmpMin = $this->currentHead--;
$tmpMax = $this->currentTail++;
for($i= $tmpMin; $iqueueName 。 self::VALU_KEY 。 $i;
@memcache_delete(self::$client, $tmpKey, 0);
}
$this->currentTail = $this->currentHead = 0;
memcache_set(self::$client, $this->head_key,$this->currentHead,false,$this->expire);
memcache_set(self::$client, $this->tail_key,$this->currentTail,false,$this->expire);
$this->_unLock();
}
/*
*すべてのmemcache保存データを削除します
*/
パブリック関数 memFlush(){
memcache_flush(self::$client);
}
}//クラスを終了
http://www.bkjia.com/PHPjc/746591.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/746591.html技術記事この篇文章主介绍了phpのmemcacheクラスの使用方法(memcache队列)、必要な友人は参照可能下memcacheQueue.class.php代码如下:?php/*** PHP memcache 队列类* @aut...