当前位置:首页 > PHP

php 队列实现

2026-01-30 05:14:30PHP

使用数据库实现队列

在PHP中可以通过数据库表模拟队列行为,创建包含iddatastatuscreated_at字段的表。插入数据时状态设为pending,消费时更新为processing,完成后标记为processed

// 生产者示例
$data = ['task_type' => 'email', 'content' => 'Hello'];
DB::table('jobs')->insert([
    'data' => json_encode($data),
    'status' => 'pending',
    'created_at' => now()
]);
// 消费者示例
$job = DB::table('jobs')
         ->where('status', 'pending')
         ->orderBy('created_at')
         ->first();
if ($job) {
    DB::table('jobs')
      ->where('id', $job->id)
      ->update(['status' => 'processing']);
    // 处理任务逻辑
    processJob(json_decode($job->data, true));
    DB::table('jobs')
      ->where('id', $job->id)
      ->update(['status' => 'processed']);
}

使用Redis列表实现队列

Redis的LPUSHRPOP命令天然适合队列操作。将序列化后的任务数据存入列表,消费者从另一端获取任务。

// 生产者
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$task = serialize(['action' => 'generate_report', 'params' => []]);
$redis->lPush('task_queue', $task);
// 消费者
while (true) {
    $task = $redis->rPop('task_queue');
    if ($task) {
        $data = unserialize($task);
        handleTask($data);
    }
    sleep(1); // 避免空轮询
}

使用专业队列系统

对于生产环境,建议使用专业的队列系统如RabbitMQ或Beanstalkd。Laravel框架内置队列支持,配置文件位于config/queue.php

安装Beanstalkd扩展后配置:

'beanstalkd' => [
    'driver' => 'beanstalkd',
    'host' => 'localhost',
    'queue' => 'default',
    'retry_after' => 90,
],

创建任务类:

php artisan make:job ProcessPodcast

分发任务:

ProcessPodcast::dispatch($podcast);

启动队列处理器:

php artisan queue:work

实现优先级队列

在Redis中可以通过多个列表实现优先级。高优先级任务放入high_queue,普通任务放入default_queue,消费者优先检查高优先级队列。

// 多优先级生产者
$redis->lPush('high_queue', serialize($urgentTask));
$redis->lPush('default_queue', serialize($normalTask));
// 多优先级消费者
$task = $redis->rPop('high_queue') 
           ?: $redis->rPop('default_queue');

处理失败任务

专业队列系统通常提供失败重试机制。Laravel队列允许设置最大尝试次数和重试延迟:

public $tries = 3;
public $backoff = [60, 120, 300];

手动处理失败任务:

php 队列实现

public function failed(Exception $exception)
{
    // 记录失败日志
    Log::error('Job failed: '.$exception->getMessage());
}

标签: 队列php
分享给朋友:

相关文章

php实现树

php实现树

PHP实现树结构的方法 在PHP中实现树结构通常可以通过递归或迭代的方式完成。以下是几种常见的实现方法: 递归实现树结构 递归是处理树结构的自然方式,尤其适用于具有未知深度的树。 class Tr…

php实现websocket

php实现websocket

PHP 实现 WebSocket WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。PHP 可以通过多种方式实现 WebSocket 功能,以下是几种常见的方法: 使用 Ratc…

php如何实现直播

php如何实现直播

实现直播功能的方法 PHP可以通过结合其他技术和工具来实现直播功能。以下是几种常见的方法: 使用流媒体服务器 配置流媒体服务器如Nginx-RTMP、Red5或Wowza。这些服务器支持RTMP协…

php 实现接口

php 实现接口

PHP 实现接口的方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不包含具体的实现。类可以实现(implement)接口,并必须实现接口中定义的所有方法。 定义接口 接口通…

基于php的设计与实现

基于php的设计与实现

PHP 设计与实现的关键要素 环境搭建与框架选择 PHP开发需配置服务器环境(如Apache/Nginx)、PHP版本(建议7.4+)及数据库(MySQL/MariaDB)。主流框架包括Laravel…

php实现跳转

php实现跳转

PHP 实现页面跳转的方法 在 PHP 中实现页面跳转有多种方式,以下是常见的几种方法及其适用场景: 使用 header() 函数 通过 header() 函数发送 HTTP 头部信息实现跳转。注意…