背景
在使用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.bat
、laravel.schedule.vbs
、laravel.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
。如图: - 然后再1分钟后去看日志和弹窗显示,如果看到日志和弹窗显示,说明任务调度已经配置成功。
- 将任务调度的两个正式文件替换掉调试文件。等下一分钟的日志,有日志了即代表配置完成。
- 删除
app/Console/Kernel.php
文件加入的额外代码,任务调度教程到此结束。
任务调度注意事项
- 调试文件下弹窗会一直弹出的,不会屏蔽的。调试文件留下弹窗是为了更加直观的看到执行的结果。
- 如果是使用的bat文件调试模式,则需要将弹窗关闭,否则下一分钟运行会被判定为未运行完成,下一分钟不会去执行的,如果是正式文件则忽略此注意事项。
- 使用vbs文件的原因是,如果使用bat文件的话每分钟都会有弹窗的(即使你用的正式文件,bat调试文件和bat正式文件的区别在于有没有命令行输出)。
- 如果有多个项目需要任务调度,复制这
laravel.schedule.bat
、laravel.schedule.vbs
、laravel.queue.bat
三个文件,直接放入新的项目里,文件做了适配,不需要修改的,然后在任务计划详情里操作里在加上一条即可。
队列教程
由于本人需求不高,开发的时候都是需要及时查看到队列的实时结果,则将php artisan queue:listen --timeout=3600
放入bat文件里了,需要的时候双击打开就好了,因为只有一个窗口,不会造成太大影响。
版权属于:塵世不再
本文链接:https://www.leeay.com/archives/58/
所有文章均采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。 您可以自由的转载和修改,但请务必注明文章来源并且不可用于商业目的。
如果博客部分文章出现空白或异常,请留言或者联系博主修复。