华为云云耀云服务器L实例评测|企业项目最佳实践之计划任务与Queue队列实践 (十)
  KRsXEGSB49bk 2023年11月13日 22 0

十一、计划任务与Queue队列实践:

1. 计划任务:

Linux环境下定时或者周期性的执行一些任务通常由cron这个守护进程来完成,这是一个系统自带的相对也比较方便的系统工具。

sudo apt-get install cron  // 默认自带

华为云云耀云服务器L实例评测|企业项目最佳实践之计划任务与Queue队列实践 (十)_php

目录结构:

目录

说明

/var/spool/cron/crontabs

用户调度任务目录,是每个用户包括root的crontab任务,每个任务以创建者的名字命名,比如用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。

/etc/crontab

系统调度任务,主要负责调度各种管理和维护任务,比如写缓存数据到硬盘、日志清理等。

/etc/cron.d/

用来存放任何要执行的crontab文件或脚本。

可以看到当配置完crontab后,就可以看到触发了发送短信的定时任务Schedule,可如下为打印出来的日志,当然,改造的代码只是做了日志的输出,并没有真实去发送短信。

华为云云耀云服务器L实例评测|企业项目最佳实践之计划任务与Queue队列实践 (十)_laravel_02


2. 消息队列场景:

我们在开发应用过程中难免会遇到处理耗时任务的需求,这些任务如果直接在用户的请求中处理,必然会导致页面显示被阻塞,可以将任务交给异步队列来处理更为方便。

创建需要存储任务的数据库表。

# 使用 database 队列驱动,需要创建一个数据表来存储任务
php artisan queue:table
# 创建一个数据表来存储队列中的任务会失败
php artisan queue:failed-table
# 使用 migrate 这条命令来创建数据表
php artisan migrate

华为云云耀云服务器L实例评测|企业项目最佳实践之计划任务与Queue队列实践 (十)_laravel_03

同时,可以看到执行migrate后,会同步生成2张表,为分别jobs(记录所有消息队列的数据)、failed_jobs(记录消费失败多少次后的数据)。

华为云云耀云服务器L实例评测|企业项目最佳实践之计划任务与Queue队列实践 (十)_数据_04

生成一个新的队列任务,这里我们模拟给某个用户发送邮件功能,当用户请求统计的路由时,会产生一个队列的待消费数据,可以在jobs表中查看到,当手动queue:listen命令执行监听时,就会触发队列中的任务进行消费,模拟打印一条日志。

华为云云耀云服务器L实例评测|企业项目最佳实践之计划任务与Queue队列实践 (十)_数据_05

# 运行 make:job Artisan 命令自动创建一个新的队列任务
php artisan make:job SendEmail
# 先手动执行监听,模拟当产生数据时,就会触发队列中的任务进行消费
php artisan queue:listen --tries=3 --timeout=30

华为云云耀云服务器L实例评测|企业项目最佳实践之计划任务与Queue队列实践 (十)_数据_06

开启监听后,得到的日志:

华为云云耀云服务器L实例评测|企业项目最佳实践之计划任务与Queue队列实践 (十)_数据_07

华为云云耀云服务器L实例评测|企业项目最佳实践之计划任务与Queue队列实践 (十)_php_08

以上,整个手动监听队列就完成了,实际上,工作的场景是在服务器上后台运行,这里需要Supervisor来进行后台监听。

apt-get install supervisor

华为云云耀云服务器L实例评测|企业项目最佳实践之计划任务与Queue队列实践 (十)_laravel_09

配置文件路径在/ /etc/supervisor/conf.d/sendMail.conf内容:

华为云云耀云服务器L实例评测|企业项目最佳实践之计划任务与Queue队列实践 (十)_laravel_10

[program:laravel-queue]
process_name=%(program_name)s_%(process_num)02d
command=php /workspace/clang-quickstart/map-api/artisan queue:work --daemon --sleep=3 --tries=3       # 命令
autostart=true
autorestart=true
directory=/workspace/clang-quickstart/map-api           # 进程的当前目录
user=www-data                        # 进程运行的用户身份
numprocs=1                           # 启动多少个进程来监听Laravel队列
redirect_stderr=true

3. 小结:

laravel中的队列服务跟其他队列服务也没有什么不同,有一个地方存放队列信息,一个PHP进程在运行时将任务写入,另外一个PHP守护进程轮询队列信息,将达到执行要求的任务执行并删除,laravel提供一个守护进程工具来查询并执行队列信息。

华为云云耀云服务器L实例评测|企业项目最佳实践之计划任务与Queue队列实践 (十)_laravel_11

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
KRsXEGSB49bk
作者其他文章 更多

2023-12-19

2023-12-11

2023-12-10

2023-12-10

2023-12-08

2023-12-07

2023-12-05

2023-12-04

ts

2023-11-30

最新推荐 更多