当前位置:首页 > 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扩展后配置:

php 队列实现

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

创建任务类:

php artisan make:job ProcessPodcast

分发任务:

ProcessPodcast::dispatch($podcast);

启动队列处理器:

php 队列实现

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];

手动处理失败任务:

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

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

相关文章

php实现登陆

php实现登陆

PHP 实现登录功能 创建登录表单 在 HTML 文件中创建一个登录表单,包含用户名和密码输入框,表单的 action 属性指向处理登录的 PHP 文件。 <form action="logi…

php实现过程

php实现过程

PHP 实现过程 PHP 是一种广泛使用的服务器端脚本语言,特别适合 Web 开发。以下是 PHP 实现过程的关键步骤和注意事项。 安装与配置 下载并安装 PHP,可以从官方 PHP 网站获取最新版…

php 实现评论

php 实现评论

实现 PHP 评论功能 数据库设计 创建数据库表存储评论数据,通常包含以下字段: id:评论唯一标识 user_id:用户ID content:评论内容 created_at:评论时间 parent…

php 购物车实现session

php 购物车实现session

PHP 购物车实现(基于 Session) 在 PHP 中,使用 Session 实现购物车功能是一种常见方法。Session 可以跨页面存储用户数据,适合临时保存购物车信息。 初始化 Sessio…

php下载文件实现

php下载文件实现

PHP 下载文件实现方法 使用 header() 函数强制下载 设置合适的 HTTP 头信息,强制浏览器下载文件而非直接打开。 $file_path = '/path/to/file.pdf'; $…

php rsa 实现

php rsa 实现

PHP RSA 加密与解密实现 生成密钥对 使用 openssl_pkey_new 生成 RSA 密钥对,并通过 openssl_pkey_export 导出私钥。公钥可从密钥对中提取。 $conf…