首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 實現訊息佇列三種方案:Memcache、共享記憶體、自定義佇列類

     編輯:PHP 綜合知識

應用場景

異步處理耗時操作(發送郵件、推播通知、日誌寫入、報表生成),削峰填谷、解耦生產者/消費者。

方案一:基於 Memcache 的計數器佇列(QMC 類)

利用 Memcache increment/decrement 原子操作維護讀寫指標,Key 設計:PREFIX + queueName + W/R + index。

class QMC {
    const PREFIX = 'QMC_';
    static private function mc() { /* 单例 Memcache 連線 */ }

    // 寫入
    static public function input($key, $value) {
        $mc = self::mc();
        $w_key = self::PREFIX . $key . 'W';
        $idx   = self::set_counter($w_key, 1); // 原子遞增取得索引
        return $mc->set(self::PREFIX . $key . $idx, $value);
    }

    // 讀取(批次)
    static public function output($key, $max = 100) {
        $mc = self::mc();
        $r_key = self::PREFIX . $key . 'R';
        $w_key = self::PREFIX . $key . 'W';
        $r = self::set_counter($r_key, 0);
        $w = self::set_counter($w_key, 0);
        if ($r == 0) $r = 1;
        $out = [];
        while ($w >= $r && $max-- > 0) {
            $v_key = self::PREFIX . $key . $r;
            $out[] = $mc->get($v_key);
            $mc->delete($v_key);
            self::set_counter($r_key, 1);
        }
        return $out;
    }
    // ... set_counter 實現略
}

優點:簡單、支援分散式、持久化可選。
缺點:大量序列化/反序列化開銷、Memcache 記憶體有限、無原生 ACK 機制。

方案二:系統共享記憶體(ShmQueue)

使用 shmop_* + sem_* 實現環狀緩衝區,支援多進程、任意資料型別(序列化後存入固定大小區塊)。

class ShmQueue {
    private $blockSize = 256; // 每塊位元組
    private $memSize   = 25600;
    // 使用 shmop_open, shmop_write, shmop_read
    // 信號量 sem_get/sem_acquire/sem_release 保護臨界區
    // 進隊 enQueue(), 出隊 deQueue()
}

優點:極高效能、無網路開銷、單機多進程安全。
缺點:僅限單機、固定區塊大小限制單條訊息長度、需管理共享記憶體生命週期。

方案三:Memcache 環狀佇列類(Memcache_Queue)

在 Memcache 中模擬環狀陣列,僅操作頭尾指標,避免全量序列化。

class Memcache_Queue {
    private $maxSize, $front, $rear, $size;
    // enQueue: 寫入 $rear 位置,遞增 rear
    // deQueue: 讀取 $front 位置,遞增 front
    // 使用 memcache->add/set/get/delete/increment/decrement
}

注意:非執行緒安全,適用低頻訊息(秒級);高併發需加分散式鎖(Redis SETNX、Memcache add)。

生產環境建議

方案適用場景建議
Redis List / Stream高併發、需持久化、ACK、消費者群組首選,生態成熟
RabbitMQ複雜路由、延遲佇列、死信、多協議企業級標準
Beanstalkd簡單、高效、優先級佇列輕量替代
Database (PDO)極低併發、無額外基建僅作備選
本文三方案學習原理、極簡部署、單機內部任務不建議核心業務直接使用

核心概念補充

  • 序列化:serialize() / json_encode() / igbinary(更快更小)。
  • 冪等性:消費者需處理重複訊息(去重 ID)。
  • 可觀測性:佇列長度、處理延遲、失敗率指標監控。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved