php队列功能实现
PHP 队列功能实现方法
使用数据库实现队列
通过数据库表模拟队列结构,适用于小型应用或开发初期。创建包含id、payload、status、created_at等字段的表。
// 入队操作示例
$payload = json_encode(['task' => 'process_image', 'data' => 'image123.jpg']);
$stmt = $pdo->prepare("INSERT INTO queue (payload, status) VALUES (?, 'pending')");
$stmt->execute([$payload]);
// 出队操作示例
$pdo->beginTransaction();
$stmt = $pdo->prepare("SELECT * FROM queue WHERE status = 'pending' ORDER BY created_at ASC LIMIT 1 FOR UPDATE");
$stmt->execute();
$job = $stmt->fetch();
if ($job) {
$update = $pdo->prepare("UPDATE queue SET status = 'processing' WHERE id = ?");
$update->execute([$job['id']]);
$pdo->commit();
// 处理任务逻辑
}
使用 Redis 实现队列
Redis 的列表结构天然适合队列场景,性能优于数据库方案。
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
// 入队
$redis->lPush('work_queue', json_encode(['task' => 'send_email', 'to' => 'user@example.com']));
// 出队
while ($job = $redis->rPop('work_queue')) {
$data = json_decode($job, true);
// 处理任务逻辑
}
使用专业队列系统
对于生产环境,推荐使用专业队列系统如 RabbitMQ、Beanstalkd 或 Amazon SQS。
RabbitMQ 示例:
$connection = new AMQPConnection([
'host' => 'localhost',
'port' => 5672,
'login' => 'guest',
'password' => 'guest'
]);
$connection->connect();
$channel = new AMQPChannel($connection);
$queue = new AMQPQueue($channel);
$queue->setName('task_queue');
$queue->declareQueue();
// 生产者
$message = new AMQPMessage('task data');
$channel->basic_publish($message, '', 'task_queue');
// 消费者
$queue->consume(function ($message) {
// 处理消息
echo $message->getBody();
$message->ack();
});
使用 Laravel 队列系统
Laravel 提供了开箱即用的队列功能,支持数据库、Redis、Beanstalkd 等多种驱动。
创建任务类:
php artisan make:job ProcessPodcast
定义任务逻辑:
class ProcessPodcast implements ShouldQueue
{
public function handle()
{
// 任务处理逻辑
}
}
分发任务:
ProcessPodcast::dispatch($podcast)->onQueue('processing');
启动队列处理器:
php artisan queue:work --queue=processing
队列监控与管理
实现队列系统时应考虑以下管理功能:
- 失败任务重试机制
- 任务超时处理
- 队列监控仪表盘
- 日志记录
对于 Laravel 项目,可以使用 Horizon 提供队列监控面板:

composer require laravel/horizon
php artisan horizon
性能优化建议
- 批量处理任务减少 I/O 操作
- 使用长连接减少连接开销
- 合理设置并发工作者数量
- 对重要任务实现优先级队列
- 使用延迟队列处理定时任务
每种方案各有优缺点,选择时应考虑应用规模、性能需求和运维成本。小型项目可从数据库方案开始,随着业务增长逐步迁移到专业队列系统。






