• 【Fastadmin/ThinkPHP5】使用Queue队列方法详细步骤


    在现代应用开发中,合理利用队列系统能够有效提升系统的性能和响应速度,尤其是在处理耗时较长的任务时,如发送大量邮件、执行定时任务等。下面是如何在ThinkPHP框架中设置和使用队列功能的详细指南:

    1.配置队列服务

    application/extra/queue.php文件中,我们设置了队列的连接器及其相关配置:

    1. use think\Env;
    2. return [
    3. 'connector' => Env::get('queue.CONNECTOR', 'redis'),//驱动类型,可选择 sync(默认):同步执行,database:数据库驱动,redis:Redis驱动,topthink:Topthink驱动
    4. //或其他自定义的完整的类名
    5. 'host' => Env::get('app.REDIS_HOST', '127.0.0.1'),
    6. 'port' => Env::get('app.REDIS_PORT', '6379'),
    7. 'password' => Env::get('app.REDIS_PASSWORD', ''),
    8. 'select' => Env::get('app.REDIS_DB', 1),
    9. ];

    上述代码中,我们可以通过环境变量灵活地配置了队列连接器,支持同步执行、数据库驱动和Redis驱动等多种方式。

    2.创建Job类

    我们在application/common/library/job/MessageSendJob.php中创建了一个处理邮件发送任务的Job类:

    1. namespace app\common\library\job;
    2. use app\common\library\Ems;
    3. use think\queue\Job;
    4. class MessageSendJob
    5. {
    6. /**
    7. * 处理邮件发送任务
    8. *
    9. * @param Job $job 当前任务对象
    10. * @param array $data 邮件发送所需数据
    11. */
    12. public function handle(Job $job, array $data)
    13. {
    14. try {
    15. // 实现邮件发送逻辑
    16. Ems::sendNotice($data['email'], $data['title'], $data['content']);
    17. echo $data['email'] . '邮件发送成功'. PHP_EOL;
    18. // 成功发送邮件后删除队列任务
    19. $job->delete();
    20. } catch (\Exception $e) {
    21. // 若邮件发送失败,可根据实际需求决定是否重新入队
    22. if ($job->attempts() < 3) { // 例如最多重试3次
    23. $job->release(60); // 在60秒后再次尝试执行
    24. } else {
    25. $this->failed($job, $data);
    26. }
    27. }
    28. }
    29. /**
    30. * 任务执行失败后的回调
    31. *
    32. * @param Job $job 当前任务对象
    33. * @param array $data 邮件发送所需数据
    34. */
    35. public function failed(Job $job, array $data)
    36. {
    37. // 记录日志或采取其他补救措施
    38. Log::record('邮件发送任务失败,邮箱:' . $data['email'], 'error');
    39. // 可考虑在此处通知管理员,或采取其他失败后处理逻辑
    40. }
    41. }

    3.将任务加入队列

    1. // 构建邮件发送任务数据
    2. $queueData = [
    3. 'email' => $email,
    4. 'title' => $title,
    5. 'content' => $content,
    6. ];
    7. // 使用MessageSendJob类将任务推送到'message'队列
    8. Queue::push(MessageSendJob::class, $queueData, 'message');

    4.启动队列监听

      在命令行环境下,我们可以通过以下命令监听特定队列或全局监听所有队列:

    • 监听特定队列(如'message'):php think queue:listen --queue message
    • 全局监听所有队列:php think queue:listen

    通过以上步骤,我们成功地在ThinkPHP框架中实现了队列任务的创建、配置与监听,使得系统在处理耗时任务时更加高效流畅。

  • 相关阅读:
    ROS2+cartorgrapher+激光雷达建图
    Linux升级OpenSSH 常见问题
    操作系统 day06(进程控制、原语)
    免费的mac电脑内存清理工具有哪些?内存不足如何优化
    Linux-常用命令(持续更新中)
    理解Linux系统:进程信号的概念,产生,保存,处理
    CAP理论及BASE思想等
    qemu sriov
    使用postman做接口测试
    智能集成式电力电容器在山东某环保材料制造厂中的应用-安科瑞黄安南
  • 原文地址:https://blog.csdn.net/q8688/article/details/136313526