亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP中實現消息隊列的要素有哪些

發布時間:2021-06-22 16:29:05 來源:億速云 閱讀:147 作者:Leah 欄目:編程語言

PHP中實現消息隊列的要素有哪些,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

1、為什么使用消息隊列

消息隊列技術是分布式應用間交換信息的一種技術。消息隊列可駐留在內存或磁盤上,隊列存儲消息直到它們被應用程序讀出。通過消息隊列,應用程序可獨立地執行,它們不需要知道彼此的位置、或在繼續執行前不需要等待接收程序接收此消息。

2. 什么場合使用消息隊列

你首先需要弄清楚,消息隊列與遠程過程調用的區別,在很多讀者咨詢我的時候,我發現他們需要的是RPC(遠程過程調用),而不是消息隊列。

消息隊列有同步或異步實現方式,通常我們采用異步方式使用消息隊列,遠程過程調用多采用同步方式。

MQ與RPC有什么不同? MQ通常傳遞無規則協議,這個協議由用戶定義并且實現存儲轉發;而RPC通常是專用協議,調用過程返回結果。

3. 什么時候使用消息隊列

同步需求,遠程過程調用(PRC)更適合你。

異步需求,消息隊列更適合你。

目前很多消息隊列軟件同時支持RPC功能,很多RPC系統也能異步調用。

消息隊列用來實現下列需求

  1. 存儲轉發

  2. 分布式事務

  3. 發布訂閱

  4. 基于內容的路由

  5. 點對點連接

以下是一個消息隊列的運用實例

<?php

/**
 * Created by PhpStorm.
 * User: lin
 * Date: 2017/6/9
 * Time: 11:19
 * 實現php共享內存消息隊列
 */
class ShmQueue
{
    private $maxQSize = 0;//隊列最大長度
    private $front = 0;//隊頭指針
    private $rear = 0; //隊尾指針
    private $blockSize = 256;  // 塊的大小(byte)
    private $memSize = 1280;  // 最大共享內存(byte)
    private $shmId = 0;//根據這個id可以操作該共享內存片段
    private $filePtr = APP_PATH.'public/shmq.ptr';
    private $semId = 0;
    public function __construct()
    {
        $shmkey = ftok(__FILE__, 't');//產生系統id
        $this->shmId = shmop_open($shmkey, "c", 0644, $this->memSize );//創建一個內存段
        $this->maxQSize = $this->memSize / $this->blockSize;
        // 申請一個信號量
        $this->semId = sem_get($shmkey, 1);
        sem_acquire($this->semId); // 申請進入臨界
        $this->init();
    }
    private function init()
    {
        if ( file_exists($this->filePtr) ){
            $contents = file_get_contents($this->filePtr);
            $data = explode( '|', $contents );
            if ( isset($data[0]) && isset($data[1])){
                $this->front = (int)$data[0];
                $this->rear  = (int)$data[1];
            }
        }
    }
    public function getLength()
    {
        return (($this->rear - $this->front + $this->memSize) % ($this->memSize) )/$this->blockSize;
    }
    public function enQueue( $value )
    {
        if ( $this->ptrInc($this->rear) == $this->front ){ // 隊滿
            return false;
        }
        //echo $this->front;
        $data = $this->encode($value);
        shmop_write($this->shmId, $data, $this->rear );
        $this->rear = $this->ptrInc($this->rear);
        return  $this->decode($data);
    }
    public function deQueue()
    {
        if ( $this->front == $this->rear ){ // 隊空
            throw new Exception(" block size is null!");
        }
        $value = shmop_read($this->shmId, $this->front, $this->blockSize-1);
        $this->front = $this->ptrInc($this->front);
        return $this->decode($value);
    }
    private function ptrInc( $ptr )
    {
        return ($ptr + $this->blockSize) % ($this->memSize);
    }
    private function encode( $value )
    {
        $data = serialize($value) . "__eof";
        //echo '';
        //echo strlen($data);
        //echo '';
       // echo $this->blockSize -1;
       // echo '';

        if ( strlen($data) > $this->blockSize -1 ){
            throw new Exception(strlen($data)." is overload block size!");
        }
        return $data;
    }
    public function exist($value){//判斷隊頭的數據

        $data = shmop_read($this->shmId, $this->front, $this->blockSize-1);
        if($value == $this->decode($data)){
            return 1;
        }
        return 0;
    }
    private function decode( $value )
    {
        //return $value;
        $data = explode("__eof", $value);
        return unserialize($data[0]);
    }
    public function __destruct()
    {
        //保存隊頭和隊尾指針
        $data = $this->front . '|' . $this->rear;
        file_put_contents($this->filePtr, $data);
        sem_release($this->semId); // 出臨界區, 釋放信號量
    }

}

如何調用

$shmq = new ShmQueue();
入隊:
$data = 125;
$shmq->enQueue($data);

出隊:
$shmq->deQueue();

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

武强县| 安康市| 嘉峪关市| 嘉善县| 江口县| 台东市| 永嘉县| 诸暨市| 扎鲁特旗| 宁国市| 金溪县| 昌乐县| 浮山县| 大邑县| 桦川县| 集贤县| 民乐县| 吉安县| 成安县| 镇赉县| 改则县| 安福县| 巴中市| 奈曼旗| 阿巴嘎旗| 衡阳县| 靖远县| 武穴市| 沾化县| 寻甸| 汝州市| 洪雅县| 昭平县| 蕲春县| 增城市| 墨竹工卡县| 乌鲁木齐县| 当涂县| 浮山县| 西贡区| 中方县|