thinkphp5中任务队列的常见使用方法

ThinkPHP5中使用队列,可以按照以下步骤进行:

1. 配置队列驱动

首先,你需要在 application/extra/queue.php 文件中配置队列驱动。如果没有这个文件,可以手动创建。

<?php
return [
    'connector' => 'database', // 队列驱动,支持 database、redis 等
    'expire'    => 60,         // 任务的过期时间,默认为60秒
    'default'   => 'default',  // 默认的队列名称
    'table'     => 'jobs',     // 存储消息的表名,需要手动创建
    'dsn'       => [],         // 数据库连接配置
];

2. 创建队列表

根据配置文件中的 table 参数,创建相应的队列表。例如,如果配置的是 jobs 表,可以使用以下SQL语句创建表:

CREATE TABLE `jobs` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
    `queue` varchar(255) NOT NULL,
    `payload` longtext NOT NULL,
    `attempts` tinyint(3) unsigned NOT NULL,
    `reserved_at` int(10) unsigned DEFAULT NULL,
    `available_at` int(10) unsigned NOT NULL,
    `created_at` int(10) unsigned NOT NULL,
    PRIMARY KEY (`id`),
    KEY `jobs_queue_index` (`queue`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

3. 推送任务到队列

使用 think\queue\Job 类将任务推送到队列中。

use think\queue\Job;

// 推送任务到队列
$job = new Job('default', 'app\job\SendEmail', ['email' => 'user@example.com']);
$job->push();

4. 创建任务类

创建一个任务类来处理具体的任务逻辑。例如,创建 application/job/SendEmail.php 文件:

<?php
namespace app\job;

use think\queue\Job;

class SendEmail
{
    public function fire(Job $job, $data)
    {
        // 处理任务逻辑
        $email = $data['email'];
        // 发送邮件
        $result = send_email($email);

        if ($result) {
            // 任务成功,删除任务
            $job->delete();
        } else {
            // 任务失败,重新入队
            $job->release();
        }
    }
}

5. 运行队列监听器

使用 queue:listen 命令来运行队列监听器,处理队列中的任务。

php think queue:listen

6. 其他队列命令

ThinkPHP5还提供了其他一些队列相关的命令:

  • queue:work:处理一个任务后立即退出
  • queue:restart:重启队列监听器
  • queue:flush:清空队列中的所有任务

示例代码

推送任务到队列

use think\queue\Job;

// 推送任务到队列
$job = new Job('default', 'app\job\SendEmail', ['email' => 'user@example.com']);
$job->push();

创建任务类

<?php
namespace app\job;

use think\queue\Job;

class SendEmail
{
    public function fire(Job $job, $data)
    {
        // 处理任务逻辑
        $email = $data['email'];
        // 发送邮件
        $result = send_email($email);

        if ($result) {
            // 任务成功,删除任务
            $job->delete();
        } else {
            // 任务失败,重新入队
            $job->release();
        }
    }
}

通过以上步骤,你可以在ThinkPHP5中使用队列来处理异步任务。

0 条评论

还没有人发表评论

发表评论 取消回复

记住我的信息,方便下次评论
有人回复时邮件通知我