背景

在使用Windows的机器使用laravel,由于开发的需要,需要在Windows下使用任务调度、队列的功能。
在面向百度的过程中发现网络的各类教程都不是特别好用,或限制太多,也不是很通用,教程也比较凌乱不够清晰,特此写下本文。
本教程的文件为通用配置代码,有多个项目需要的话,只需要无脑复制粘贴文件即可,不需要更改文件内容。

原理

利用Windows自带的任务计划程序调用特定的脚本文件即可。

代码

一共三个文件,两个用于任务调度,一个用于队列

第一个laravel.schedule.bat

正式文件

cd /d %~dp0
@php artisan schedule:run 1>> NUL 2>&1

调试文件

cd /d %~dp0
@php artisan schedule:run
pause

第二个laravel.schedule.vbs

正式文件

Set schedule = CreateObject("Wscript.Shell")
path = CreateObject("Scripting.FileSystemObject").GetFile(Wscript.ScriptFullName).ParentFolder.Path
schedule.run "cmd /c " + path + "\laravel.schedule.bat",vbhide

调试文件

Set schedule = CreateObject("Wscript.Shell")
path = CreateObject("Scripting.FileSystemObject").GetFile(Wscript.ScriptFullName).ParentFolder.Path
schedule.run "cmd /c " + path + "\laravel.schedule.bat"

第三个laravel.queue.bat

正式文件/调试文件

cd /d %~dp0
@php artisan queue:listen --timeout=3600

任务调度教程

本教程基于你已经会使用基础的lravel以及一定程度上了解laravel任务调度的相关用法的情况下,如果不会,请阅读文档。
首先如果你已经会了,请直接保存正式文件。如果不会,正式文件、调试文件请各保存一份,本文教程是基于调试文件。

  • 请将保存后的laravel.schedule.batlaravel.schedule.vbslaravel.queue.bat三个文件放入项目根目录里,如我的项目路径是D:\www\demo现已实现 laravel_config.ini文件放入到项目文件夹的上级文件夹里,也就是D:\www里。
  • (可选)并在.gitignore,文件里加入/laravel.*,当然也可以加入*.bat*.vbs,这个步骤可选,可以不操作,目的是不上传这几个文件到你的git库里。
  • 现已实现 配置php路径。打开laravel_config.ini文件,将php=的后面改成你自己本地环境下的php可执行文件绝对路径,结尾是\php.exe,例如:D:\php\php.exe。PS:笔者对bat命令研究甚少,不知道如何设置下能直接获取到php路径或者直接在bat下直接能运行php,而不需要完整路径。
  • 打开app/Console/Kernel.php文件,在schedule下添加如下代码:
$schedule->call(function () {
    info('执行了任务调度');
});
  • 资源管理器访问项目目录,运行laravel.schedule.bat。如果执行成功,则在storage/logs/laravel.log文件下能看到local.INFO: 执行了任务调度的日志记录,在弹出的命令窗口里能看到,能看到Running scheduled command: Closure的记录。如图:
    调试运行结果
  • 如果运行通过,则开始最重要的任务计划配置了;如果没有通过,则根据提示继续调试。
  • 输入win+R然后输入taskschd.msc进入定时任务设置界面,按照如下操作新建一个任务。
    建议使用新建目录以后好找到自己定义的任务计划

建议使用新建目录以后好找到自己定义的任务计划

请输入图片描述

请输入图片描述

会发现最小选择是5分钟,先选择5分钟,然后选中5,直接改成1就好了。
9月17日更新:选择每天,每隔1天(最小只能填写1。吐槽一下,每隔1天讲道理是2天运行一次的样子,实际上是每天都在运行的,是我语文不好吗?)选择一次(选择一次的话导致禁用后启用不再自动运行,需要重新添加)
请输入图片描述

请输入图片描述

选择D:\www\demo\laravel.schedule.vbs
请输入图片描述

随便写啥都行,只要自己记得就好了。
请输入图片描述

  • 等1分钟后去storage/logs/laravel.log日志里查看是否有local.INFO: 执行了任务调度的日志记录,在弹出的命令窗口里能看到,能看到Running scheduled command: Closure的记录。
  • 然后去任务里将启动程序修改为D:\www\demo\laravel.schedule.vbs。如图:
    改为vbs屏蔽弹窗
  • 然后再1分钟后去看日志和弹窗显示,如果看到日志和弹窗显示,说明任务调度已经配置成功。
  • 将任务调度的两个正式文件替换掉调试文件。等下一分钟的日志,有日志了即代表配置完成。
  • 删除app/Console/Kernel.php文件加入的额外代码,任务调度教程到此结束。

任务调度注意事项

  • 调试文件下弹窗会一直弹出的,不会屏蔽的。调试文件留下弹窗是为了更加直观的看到执行的结果。
  • 如果是使用的bat文件调试模式,则需要将弹窗关闭,否则下一分钟运行会被判定为未运行完成,下一分钟不会去执行的,如果是正式文件则忽略此注意事项。
  • 使用vbs文件的原因是,如果使用bat文件的话每分钟都会有弹窗的(即使你用的正式文件,bat调试文件和bat正式文件的区别在于有没有命令行输出)。
  • 如果有多个项目需要任务调度,复制这laravel.schedule.batlaravel.schedule.vbslaravel.queue.bat三个文件,直接放入新的项目里,文件做了适配,不需要修改的,然后在任务计划详情里操作里在加上一条即可。

队列教程

由于本人需求不高,开发的时候都是需要及时查看到队列的实时结果,则将php artisan queue:listen --timeout=3600放入bat文件里了,需要的时候双击打开就好了,因为只有一个窗口,不会造成太大影响。

Last modification:December 15th, 2022 at 07:39 pm
如果觉得我的文章对你有用,请随意赞赏