php如何实现队列
PHP 实现队列的方法
使用数组模拟队列
PHP 数组可以模拟队列的先进先出(FIFO)特性。array_push 用于入队,array_shift 用于出队。
$queue = [];
array_push($queue, 'item1'); // 入队
$item = array_shift($queue); // 出队
使用 SplQueue 类
PHP 标准库(SPL)提供了 SplQueue 类,专为队列操作设计,性能优于数组。
$queue = new SplQueue();
$queue->enqueue('item1'); // 入队
$item = $queue->dequeue(); // 出队
使用 Redis 实现持久化队列
Redis 的 LPUSH 和 RPOP 命令可实现高性能持久化队列,适合分布式场景。
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->lPush('queue', 'item1'); // 入队
$item = $redis->rPop('queue'); // 出队
使用数据库表模拟队列
通过数据库表实现队列,适合需要持久化和复杂查询的场景。
-- 建表示例
CREATE TABLE queue (
id INT AUTO_INCREMENT PRIMARY KEY,
data TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
// 入队
$stmt = $pdo->prepare("INSERT INTO queue (data) VALUES (?)");
$stmt->execute(['item1']);
// 出队
$pdo->beginTransaction();
$stmt = $pdo->query("SELECT * FROM queue ORDER BY id ASC LIMIT 1 FOR UPDATE");
$item = $stmt->fetch();
$pdo->exec("DELETE FROM queue WHERE id = " . $item['id']);
$pdo->commit();
使用消息队列系统(如 RabbitMQ)
对于高并发场景,可集成专业消息队列系统,需安装 AMQP 扩展。
$connection = new AMQPConnection(['host' => 'localhost']);
$connection->connect();
$channel = new AMQPChannel($connection);
$queue = new AMQPQueue($channel);
$queue->setName('php_queue');
$queue->declareQueue();
$queue->bind('exchange_name', 'routing_key'); // 可选绑定
$queue->publish('item1'); // 入队
$message = $queue->get();
if ($message) {
$queue->ack($message->getDeliveryTag()); // 确认消费
}
使用 Laravel 的队列系统
Laravel 提供了开箱即用的队列功能,支持数据库、Redis 等驱动。
// 分发任务
dispatch(new ProcessPodcast($podcast));
// 定义任务类
class ProcessPodcast implements ShouldQueue
{
public function handle()
{
// 处理逻辑
}
}
性能对比与选型建议
- 内存操作:
SplQueue性能最佳(约 0.001ms/操作),但数据不持久。 - Redis:读写性能高(约 0.1ms/操作),支持持久化和分布式。
- 数据库:吞吐量较低(约 10ms/操作),适合低频可靠队列。
- 专业MQ:支持高级特性(如重试、死信队列),但需维护中间件。
对于简单场景,优先使用 SplQueue 或 Redis;复杂业务系统建议采用 RabbitMQ 或 Laravel 队列。







