php 队列实现
PHP队列实现方法
PHP队列可以通过多种方式实现,包括数据库、文件系统、Redis或专业队列系统如RabbitMQ。以下是几种常见的实现方式:
使用数据库实现队列
创建数据库表存储队列任务,利用事务和锁机制保证任务顺序。
CREATE TABLE queue (
id INT AUTO_INCREMENT PRIMARY KEY,
task_data TEXT NOT NULL,
status ENUM('pending', 'processing', 'completed') DEFAULT 'pending',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
processed_at TIMESTAMP NULL
);
PHP代码示例:
// 入队
$stmt = $pdo->prepare("INSERT INTO queue (task_data) VALUES (?)");
$stmt->execute([json_encode($taskData)]);
// 出队
$pdo->beginTransaction();
$stmt = $pdo->prepare("SELECT * FROM queue WHERE status = 'pending' ORDER BY id ASC LIMIT 1 FOR UPDATE");
$stmt->execute();
$task = $stmt->fetch(PDO::FETCH_ASSOC);
if ($task) {
$updateStmt = $pdo->prepare("UPDATE queue SET status = 'processing' WHERE id = ?");
$updateStmt->execute([$task['id']]);
$pdo->commit();
// 处理任务
}
使用Redis实现队列
Redis的列表数据结构非常适合实现队列,提供原子性操作。
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
// 入队
$redis->rPush('queue', json_encode($taskData));
// 出队
$taskJson = $redis->lPop('queue');
if ($taskJson) {
$taskData = json_decode($taskJson, true);
// 处理任务
}
使用专业队列系统
对于复杂场景,可以使用RabbitMQ、Beanstalkd等专业队列系统。

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();
// 入队
$queue->publish(json_encode($taskData));
// 出队
$queue->consume(function ($envelope, $queue) {
$taskData = json_decode($envelope->getBody(), true);
// 处理任务
$queue->ack($envelope->getDeliveryTag());
});
使用Laravel队列系统
Laravel框架提供了完整的队列解决方案,支持多种驱动。
创建任务类:

php artisan make:job ProcessTask
定义任务逻辑:
class ProcessTask implements ShouldQueue
{
public function __construct(public array $data) {}
public function handle()
{
// 处理任务逻辑
}
}
分发任务:
ProcessTask::dispatch($data)->onQueue('high');
启动队列处理器:
php artisan queue:work --queue=high,default
每种实现方式各有优缺点,数据库实现简单但性能较低,Redis性能好但缺乏持久化保证,专业队列系统功能全面但配置复杂。应根据具体需求选择合适的方案。






