php 队列实现
队列数据结构基础
队列是一种先进先出(FIFO)的线性数据结构,包含两个主要操作:入队(enqueue)在队尾添加元素,出队(dequeue)从队头移除元素。PHP中可通过数组或链表实现。
基于数组的队列实现
使用PHP数组模拟队列,需注意数组操作效率:
class ArrayQueue {
private $queue = [];
public function enqueue($item) {
array_push($this->queue, $item);
}
public function dequeue() {
if ($this->isEmpty()) {
return null;
}
return array_shift($this->queue);
}
public function isEmpty() {
return empty($this->queue);
}
public function size() {
return count($this->queue);
}
}
数组实现的array_shift操作时间复杂度为O(n),因需要重新索引剩余元素。
高效的双指针数组队列
通过维护头尾指针减少重新索引开销:
class OptimizedArrayQueue {
private $queue = [];
private $head = 0;
private $tail = 0;
public function enqueue($item) {
$this->queue[$this->tail++] = $item;
}
public function dequeue() {
if ($this->isEmpty()) {
return null;
}
$item = $this->queue[$this->head];
unset($this->queue[$this->head++]);
return $item;
}
public function isEmpty() {
return $this->head >= $this->tail;
}
}
此实现使dequeue操作变为O(1),但可能造成内存浪费,需定期压缩数组。
链表实现队列
SplDoublyLinkedList提供高效实现:
class LinkedListQueue {
private $list;
public function __construct() {
$this->list = new SplDoublyLinkedList();
}
public function enqueue($item) {
$this->list->push($item);
}
public function dequeue() {
return $this->list->shift();
}
public function isEmpty() {
return $this->list->isEmpty();
}
}
链表实现所有操作均为O(1)时间复杂度,适合高频队列操作场景。

PHP标准库解决方案
SplQueue是标准库提供的队列实现:
$queue = new SplQueue();
$queue->enqueue('a'); // 入队
$queue->dequeue(); // 出队
$queue->isEmpty(); // 检查空队列
SplQueue继承自SplDoublyLinkedList,提供完整的队列接口。
阻塞队列实现
使用swoole或workerman实现协程阻塞队列:
$chan = new Swoole\Coroutine\Channel(10);
go(function() use ($chan) {
$chan->push('data');
});
go(function() use ($chan) {
$data = $chan->pop();
});
适用于需要等待队列元素的并发场景。

优先级队列实现
SplPriorityQueue提供优先级队列功能:
$pq = new SplPriorityQueue();
$pq->insert('task1', 3);
$pq->insert('task2', 1);
$pq->extract(); // 返回优先级最高的'task1'
通过比较器可实现复杂优先级逻辑。
持久化队列方案
使用数据库或Redis实现持久化:
// Redis实现示例
$redis = new Redis();
$redis->connect('127.0.0.1');
$redis->rPush('queue', 'item1');
$item = $redis->lPop('queue');
适合需要消息持久化的分布式系统场景。
性能优化建议
高频队列操作场景应避免使用纯数组实现,优先考虑SplQueue或链表结构。对于百万级数据量,需评估内存使用情况,必要时采用分块存储策略。






