php 队列的实现
PHP 队列的实现方法
使用数组实现简单队列
PHP 数组可以模拟队列的 FIFO(先进先出)行为。array_push 用于入队,array_shift 用于出队。
$queue = [];
array_push($queue, 'item1'); // 入队
array_push($queue, 'item2');
$firstItem = array_shift($queue); // 出队,返回 'item1'
使用 SplQueue 类
PHP 标准库提供的 SplQueue 是专门实现的队列数据结构,性能优于数组操作。
$queue = new SplQueue();
$queue->enqueue('item1'); // 入队
$queue->enqueue('item2');
$firstItem = $queue->dequeue(); // 出队,返回 'item1'
数据库驱动队列
通过数据库表实现持久化队列,适合需要持久化和跨请求的场景。
CREATE TABLE queue (
id INT AUTO_INCREMENT PRIMARY KEY,
data TEXT NOT NULL,
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();
if ($item) {
$deleteStmt = $pdo->prepare("DELETE FROM queue WHERE id = ?");
$deleteStmt->execute([$item['id']]);
$pdo->commit();
}
Redis 实现队列
利用 Redis 的 LPUSH 和 RPOP 命令实现高性能队列。
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->lPush('my_queue', 'item1'); // 入队
$item = $redis->rPop('my_queue'); // 出队
Laravel 队列系统
Laravel 提供了开箱即用的队列系统,支持数据库、Redis 等多种驱动。
定义任务类:
php artisan make:job ProcessPodcast
在 app/Jobs/ProcessPodcast.php 中实现逻辑:
public function handle()
{
// 处理任务逻辑
}
分发任务:
ProcessPodcast::dispatch($podcast);
启动队列处理器:
php artisan queue:work
消息队列扩展(如 RabbitMQ)
通过 AMQP 扩展与 RabbitMQ 交互,适合分布式系统。
$connection = new AMQPConnection(['host' => 'localhost']);
$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 $msg->body;
$msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
};
$channel->basic_consume('task_queue', '', false, false, false, false, $callback);
注意事项
- 数据库队列需处理并发问题,建议使用事务和行锁。
- Redis 队列需考虑持久化配置,避免重启丢失数据。
- 生产环境建议使用 Supervisor 监控队列处理器进程。
- 对于高吞吐量场景,优先选择 Redis 或专业消息队列中间件。







