php 队列实现
队列的基本概念
队列是一种先进先出(FIFO)的数据结构,元素从队尾入队,从队头出队。PHP中可以通过数组或SplQueue类实现队列功能。
使用数组实现队列
PHP数组提供了array_push和array_shift函数,可以模拟队列操作:

$queue = [];
// 入队操作
array_push($queue, 'item1');
array_push($queue, 'item2');
// 出队操作
$firstItem = array_shift($queue);
echo $firstItem; // 输出: item1
使用SplQueue类
PHP标准库提供了SplQueue类专门用于队列操作:
$queue = new SplQueue();
// 入队操作
$queue->enqueue('item1');
$queue->enqueue('item2');
// 出队操作
$firstItem = $queue->dequeue();
echo $firstItem; // 输出: item1
// 查看队列长度
echo $queue->count(); // 输出: 1
实现阻塞队列
对于需要等待队列中有元素才能出队的场景,可以结合条件变量实现:

class BlockingQueue {
private $queue;
private $mutex;
public function __construct() {
$this->queue = new SplQueue();
$this->mutex = new SyncMutex();
}
public function enqueue($item) {
$this->mutex->lock();
$this->queue->enqueue($item);
$this->mutex->unlock();
}
public function dequeue() {
$this->mutex->lock();
while($this->queue->isEmpty()) {
$this->mutex->unlock();
usleep(100000); // 等待100ms
$this->mutex->lock();
}
$item = $this->queue->dequeue();
$this->mutex->unlock();
return $item;
}
}
使用Redis实现分布式队列
对于分布式系统,可以使用Redis作为队列存储:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
// 入队
$redis->rPush('myqueue', 'item1');
// 出队
$item = $redis->lPop('myqueue');
消息队列扩展
对于更复杂的队列需求,可以使用专业的消息队列系统如RabbitMQ:
// 使用php-amqplib库
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
// 声明队列
$channel->queue_declare('task_queue', false, true, false, false);
// 发布消息
$msg = new AMQPMessage('Hello World!');
$channel->basic_publish($msg, '', 'task_queue');
// 消费消息
$callback = function ($msg) {
echo "Received: ", $msg->body, "\n";
};
$channel->basic_consume('task_queue', '', false, true, false, false, $callback);






