異步處理耗時操作(發送郵件、推播通知、日誌寫入、報表生成),削峰填谷、解耦生產者/消費者。
利用 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 機制。
使用 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 中模擬環狀陣列,僅操作頭尾指標,避免全量序列化。
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(更快更小)。