简介
过去,你可能需要在服务器上为每一个调度任务去创建 Cron 入口。但是这种方式很快会变得不友好,因为这些任务调度不在源代码中,并且你每次都需要通过 SSH 链接登录到服务器中才能增加 Cron 入口。
Laravel 命令行调度器允许你在 Laravel 中对命令调度进行清晰流畅的定义。且使用这个任务调度器时,你只需要在你的服务器上创建单个 Cron 入口。你的任务调度在 app/Console/Kernel.php 的 schedule 方法中进行定义。为了帮助你更好的入门,这个方法中有个简单的例子。
启动调度器
当使用这个调度器时,你只需要把下面的 Cron 入口添加到你的服务器中。如果你不知道怎么在服务器中添加 Cron 入口,可以考虑使用一些服务来管理 Cron 入口,比如 Laravel Forge :
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
这个 Cron 会每分钟执行一次 Laravel 的命令行调度器。当 schedule:run 命令被执行的时候,Laravel 会根据你的调度执行预定的程序。
Shell 调度命令
exec 方法可用于向操作系统发送命令:
$schedule->exec('node /home/forge/script.js')->daily();
任务只运行在一台服务器上 onOneServer
注意:你的应用默认缓存驱动必须是 memcached 或 redis 才能使用这个特性。除此之外,所有服务器必须使用同一台中央缓存服务器来通信。
若你的应用在多台服务器中运行,你可能需要限制某个计划任务仅在单台服务器上运行。假如你有一个计划任务:在每周五晚生成一份新报告。若此任务调度器在三台服务器上运行,那么该任务就会在三台服务器上运行并生成三份报告。这样不好。
当你定义计划任务时,可使用 onOneServer 方法表明该任务仅在单台服务器上运行。如此,第一台获取到该任务的服务器,会给它附加一个原子锁,这样便可防止其他服务器在同一时间内执行同一个任务:
$schedule->command('report:generate') ->fridays() ->at('17:00') ->onOneServer();
任务调度官方文档:
https://learnku.com/docs/laravel/6.x/scheduling/5169