PHP memcache リングキュー

Jul 25, 2016 am 08:48 AM

PHP memcache リング キュー クラス。私は初心者で、ビジネス上のニーズがあるため、データ構造についてあまり学習していません。 プロトタイプは、oschina の lusi によって共有されている PHP memcache キュー コードです。 int の長さが境界を越えるリスクがなく、いつでもキューに出入りできるようにするため (シングルチェーンが Head 自動インクリメントを採用している場合、処理せずに境界を越える可能性があります)、単に循環キューに書き換えられるだけです。まだバグがあるかもしれません、ごめんなさい!
  1. /**
  2. * PHP memcache リング キュー クラス
  3. * オリジナル作成者 LKK/lianq.net
  4. * FoxHunter を修正
  5. * ビジネス上のニーズにより、キュー内のポップとプッシュのみが保持されます 有効期限を 0 に変更します。これは永続的です
  6. */
  7. class MQueue
  8. {
  9. public static $client;
  10. private $expire //有効期限、秒、1~2592000、つまり以内30 日
  11. private $sleepTime; // ロック解除までの待ち時間、マイクロ秒
  12. private $queueName; // キュー名、一意の値
  13. private $retryNum; // 試行回数
  14. private $MAXNUM; canRewrite; // スイッチを上書きすることは可能ですか?
  15. 完全な内容が元のデータを上書きします
  16. private $HEAD // 次のステップで入力されるポインターの位置
  17. private $TAIL;次のステップで入力するポインターの位置
  18. private $LEN; //キューの現在の長さ
  19. const LOCK_KEY = '_Fox_MQ_LOCK_' //ロックストレージインジケーター
  20. const LENGTH_KEY = '_Fox_MQ_LENGTH_';キューのインジケーター
  21. const VALU_KEY = '_Fox_MQ_VAL_'; // キューのキー値ストレージインジケーター
  22. const HEAD_KEY = '_Fox_MQ_HEAD_' // キューの HEAD ポインターの位置インジケーター
  23. const TAIL_KEY = '_Fox_MQ_TAIL_'; // キューの TAIL の位置インジケーター
  24. /*
  25. * コンストラクター
  26. * 同じ $queueName の場合、インスタンス化するときは、コンストラクターのパラメーター値が一貫していることを確認する必要があります。そうでないと、ポップとプッシュによってキューの順序が混乱します
  27. */
  28. public function __construct($queueName = '', $maxqueue = 1, $canRewrite = false, $expire = 0, $config = '')
  29. {
  30. if (empty($config)) {
  31. self::$client = memcache_pconnect( '127.0.0.1', 11211);
  32. } elseif (is_array($config)) { //array ('host'=>'127.0.0.1','port'=>'11211')
  33. self:: $client = memcache_pconnect($config['host'], $config['port']);
  34. } elseif (is_string($config)) { //"127.0.0.1:11211"
  35. $tmp =explode(': ', $config);
  36. $conf['host'] = isset($tmp[0]) ? $tmp[0] : '127.0.0.1';
  37. $conf['port'] = isset($tmp[ 1]) ? $tmp[1] : '11211';
  38. self::$client = memcache_pconnect( $conf['host'], $conf['port']);
  39. }
  40. if (!self::$ client)
  41. return false;
  42. ignore_user_abort(true); //クライアントが切断された場合、実行の継続を許可します
  43. set_time_limit(0) //スクリプト実行遅延の上限をキャンセルします
  44. $this->access = false;
  45. $this->sleepTime = 1000;
  46. $expire = (empty($expire)) ? 0 : (int ) $expire + 1;
  47. $this->expire = $expire;
  48. $this->queueName = $queueName;
  49. $this->retryNum = 20000;
  50. $this->MAXNUM = $maxqueue != null ? $maxqueue : 1;
  51. $this->canRewrite = $canRewrite;
  52. $this->getHeadAndTail ();
  53. if (!isset($this->HEAD) || empty($this->HEAD))
  54. $this->HEAD = 0;
  55. if (!isset($this->TAIL) ) || 空($this->TAIL))
  56. $this->TAIL = 0;
  57. if (!isset($this->LEN) || 空($this->LEN))
  58. $ this->LEN = 0;
  59. }
  60. //先頭と末尾のポインタ情報とキューの長さを取得
  61. private function getHeadAndTail()
  62. {
  63. $this->HEAD = (int) memcache_get(self: :$client, $this->queueName . self::HEAD_KEY);
  64. $this->TAIL = (int) memcache_get( self::$client, $this->queueName . self::TAIL_KEY);
  65. $this->LEN = (int) memcache_get(self::$client, $this->queueName . self::LENGTH_KEY) ;
  66. }
  67. // memcache_add アトミック ロックを使用します
  68. プライベート関数 lock()
  69. {
  70. if ($this->access === false) {
  71. $i = 0;
  72. while (!memcache_add(self ::$client, $this->queueName . self::LOCK_KEY, 1, false, $ this->expire)) {
  73. usleep($this->sleepTime);
  74. @$i++;
  75. if ($ i > $this->retryNum) { //N 回待機してみます
  76. return false;
  77. Break;
  78. }
  79. }
  80. return $this->access = true;
  81. }
  82. return false;
  83. }
  84. / /次の位置を指すようにヘッドポインタを更新します
  85. private function incrHead()
  86. {
  87. / /$this->getHeadAndTail(); //このメソッド本体がロック内で呼び出されるため、最新のポインタ情報を取得します。このメソッドが呼び出され、この行のコメントが
  88. $this->HEAD++; //移動ヘッドポインタダウン
  89. if ($this->HEAD >= $this->MAXNUM) {
  90. $this-> ;HEAD = 0; //境界値修正
  91. }
  92. ;
  93. $this->LEN--; //Head の移動は Pop によって引き起こされるため、数量の減少に相当します
  94. if ($this->LEN $this- >LEN = 0; //境界値の修正
  95. }
  96. ;
  97. memcache_set(self::$client, $this->queueName . self::HEAD_KEY, $this->HEAD, false, $this->期限切れ); //更新
  98. memcache_set(self::$client, $this->queueName . self::LENGTH_KEY, $this->LEN, false, $this->expire); // 更新
  99. }
  100. //ポインタは次の位置を指します
  101. private function incrTail()
  102. {
  103. //$this->getHeadAndTail() //このメソッド本体はメソッド内で呼び出されるため、最新のポインタ情報を取得します。ロック、ロック内で呼び出されています このメソッドについては、この行をコメント化します
  104. $this->TAIL++; //末尾ポインタを下に移動します
  105. if ($this->TAIL >= $this->MAXNUM) {
  106. $this->TAIL = 0 ; //境界値補正
  107. }
  108. ;
  109. $this->LEN++ //ヘッドの移動はPushによって引き起こされるので、量の増加に相当します
  110. if ($ this->LEN >= $this->MAXNUM ) {
  111. $this->LEN = $this->MAXNUM; //境界値の長さの修正
  112. }
  113. ;
  114. memcache_set(self::$client, $this->queueName . self::TAIL_KEY, $this ->TAIL, false, $this->expire); //Update
  115. memcache_set(self::$client, $this->queueName . self: :LENGTH_KEY, $this->LEN, false, $this ->expire); //Update
  116. }
  117. //ロック解除
  118. プライベート関数 unLock()
  119. {
  120. memcache_delete(self::$client, $this ->queueName . self::LOCK_KEY);
  121. $this ->access = false;
  122. }
  123. //キューがいっぱいかどうかを判断する
  124. public function isFull()
  125. {
  126. //外部から直接呼び出された場合、ロックがないため、ここでの値は近似値であり、あまり正確ではありませんが、その前にロックがあるため、内部呼び出しは信頼できます
  127. if ($this->canRewrite)
  128. return false;
  129. return。 $this->LEN == $this->MAXNUM ? true : false;
  130. }
  131. //空かどうかを判定
  132. public function isEmpty()
  133. {
  134. //外部から直接呼び出された場合は、ただし、内部呼び出しの前にロックがあるため、Trusted
  135. return $this->LEN == 0 true : false;
  136. }
  137. public function getLen()
  138. {
  139. //外部から直接呼び出された場合、ロックがないため、ここでの値は近似値であり、あまり正確ではありませんが、内部呼び出しでは前にロックがあるため、は信頼できます
  140. return $this->LEN;
  141. }
  142. /*
  143. * Push value
  144. * @param 混合値
  145. * @return bool
  146. */
  147. public function Push($data = '')
  148. {
  149. $result = false;
  150. if (empty($data))
  151. return $result;
  152. if (!$this->gt;lock()) {
  153. return $result;
  154. }
  155. $this->getHeadAndTail( ); //最新のポインター情報を取得します
  156. if ($this->isFull()) { //完全な概念は非上書き下でのみ使用可能です
  157. $ this->unLock();
  158. return false;
  159. }
  160. if (memcache_set(self::$client, $this->queueName . self::VALU_KEY . $this->TAIL, $data, MEMCACHE_COMPRESSED, $this->expire)) {
  161. //After押すと、尾部と頭が重なっていることがわかり(ポインタはまだ移動していません)、右側にまだヘッドが読み取っていないデータがあるため、尾部を避けるためにヘッドポインタを移動します ポインタがヘッドにまたがっています
  162. if ($this->TAIL == $this->HEAD && $this->LEN >= 1) {
  163. $this->incrHead();
  164. }
  165. $this->gt ;incrTail( ); //末尾ポインタを移動します
  166. $result = true;
  167. }
  168. $this->unLock();
  169. return $result;
  170. }
  171. /*
  172. * 値をポップします
  173. * @param [length ] int キューの長さ
  174. * @return array
  175. */
  176. public function Pop($length = 0)
  177. {
  178. if (!is_numeric($length))
  179. return false;
  180. if (!$this-> lock( ))
  181. return false;
  182. $this->getHeadAndTail();
  183. if (empty($length))
  184. $length = $this->LEN //デフォルトですべてを読み取ります
  185. if ( $this ->isEmpty()) {
  186. $this->unLock();
  187. return false;
  188. }
  189. //キューの長さを超えた長さを取得した後の修正
  190. if ($length > $this->LEN )
  191. $length = $this->LEN;
  192. $data = $this->gt;popKeyArray($length);
  193. $this->unLock();
  194. return $data;
  195. }
  196. /*
  197. * 特定の長さの値をポップします
  198. * @param [length] int queue length
  199. * @return array
  200. */
  201. private function PopKeyArray($length)
  202. {
  203. $result = array() ;
  204. if (empty($length))
  205. return $result;
  206. for ($k = 0; $k $result[] = @memcache_get(self::$client, $ this ->queueName .self::VALU_KEY .$this->HEAD);
  207. @memcache_delete(self::$client, $this->queueName .self::VALU_KEY .$this->HEAD, 0) ;
  208. //値を抽出した後、先頭と末尾が重なっていることがわかり(この時点ではポインタは移動していません)、右側にはデータがありません。つまり、キューの最後のデータは完全に空です。このとき、ポインタはローカルに留まり、移動しません。 if ($this->TAIL == $this->HEAD && $this->LEN $this->LEN = 0;
  209. memcache_set(self::$ client, $this->queueName . self::LENGTH_KEY, $this->LEN, false, $this->expire);
  210. Break;
  211. } else {
  212. $this->incrHead() ; //先頭と末尾が重なっていない、または重なっているがまだ読み取られていないデータがあるため、次に読み込む位置に HEAD ポインタを移動します
  213. }
  214. }
  215. return $result;
  216. }
  217. /*
  218. * キューをリセット
  219. * * @return NULL
  220. */
  221. プライベート関数reset($all = false)
  222. {
  223. if ($all) {
  224. memcache_delete(self) ::$client, $this->queueName . self::HEAD_KEY , 0);
  225. memcache_delete(self::$client, $this->queueName . self::TAIL_KEY, 0);
  226. memcache_delete(self:: $client, $this->queueName . self::LENGTH_KEY, 0 );
  227. } else {
  228. $this->HEAD = $this->TAIL = $this->LEN = 0;
  229. memcache_set(self ::$client, $this->queueName . self::HEAD_KEY , 0, false, $this->expire);
  230. memcache_set(self::$client, $this->queueName . self::TAIL_KEY, 0, false, $this->expire);
  231. memcache_set(self ::$client, $this->queueName . self::LENGTH_KEY, 0, false, $this->expire);
  232. }
  233. }
  234. /*
  235. * すべての memcache キャッシュ データをクリアします
  236. * @return NULL
  237. */
  238. public function memFlush()
  239. {
  240. memcache_flush(self::$client);
  241. }
  242. public function clear($all = false)
  243. {
  244. if (!$this->lock())
  245. return false;
  246. $this->getHeadAndTail();
  247. $Head = $this->HEAD;
  248. $Length = $this->LEN ;
  249. $curr = 0;
  250. for ($i = 0; $ i $curr = $this->$Head + $i;
  251. if ($curr >= $ this->MAXNUM) {
  252. $this->HEAD = $curr = 0;
  253. }
  254. @memcache_delete(self::$client, $this->queueName . self::VALU_KEY . $curr, 0);
  255. }
  256. $this->unLock();
  257. $ this->reset($all);
  258. return true;
  259. }
  260. }
コードをコピー

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHPのカール:REST APIでPHPカール拡張機能を使用する方法 PHPのカール:REST APIでPHPカール拡張機能を使用する方法 Mar 14, 2025 am 11:42 AM

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

Codecanyonで12の最高のPHPチャットスクリプト Codecanyonで12の最高のPHPチャットスクリプト Mar 13, 2025 pm 12:08 PM

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

PHPにおける後期静的結合の概念を説明します。 PHPにおける後期静的結合の概念を説明します。 Mar 21, 2025 pm 01:33 PM

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

フレームワークセキュリティ機能:脆弱性から保護します。 フレームワークセキュリティ機能:脆弱性から保護します。 Mar 28, 2025 pm 05:11 PM

記事では、入力検証、認証、定期的な更新など、脆弱性から保護するためのフレームワークの重要なセキュリティ機能について説明します。

フレームワークのカスタマイズ/拡張:カスタム機能を追加する方法。 フレームワークのカスタマイズ/拡張:カスタム機能を追加する方法。 Mar 28, 2025 pm 05:12 PM

この記事では、フレームワークにカスタム機能を追加し、アーキテクチャの理解、拡張ポイントの識別、統合とデバッグのベストプラクティスに焦点を当てています。

PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? Apr 01, 2025 pm 03:12 PM

PHP開発でPHPのCurlライブラリを使用してJSONデータを送信すると、外部APIと対話する必要があることがよくあります。一般的な方法の1つは、Curlライブラリを使用して投稿を送信することです。

See all articles