- 定义调度
你可以在App\Console\Kernel
类的schedule
方法中定义所有调度任务。在开始之前,先看看一个调度任务的例子。在该例子中,我们将计划在每天午夜调用一个 Closure。在这个 Closure 中,将执行一个数据库查询来清除一个表:
<?php
namespace AppConsole;
use DB;
use IlluminateConsoleSchedulingSchedule;
use IlluminateFoundationConsoleKernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
protected $commands = [
\App\Console\Commands\Inspire::class,
];
/** * 定义应用的命令调度
* * @param IlluminateConsoleSchedulingSchedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
$schedule->call(function () {
DB::table('recent_users')->delete();
})->daily();
}
}
- 启动调度器
需要在linux服务器上用root身份登录,使用crontab -e
命令,或者
vim /var/spool/cron/root
将以下 Cron 项目添加到服务器。
注意,php和调度的项目路径都必须使用绝对路径:
* * * * * /usr/local/php72/bin/php /path-to-your-project/artisan schedule:run \>\> /dev/null 2\>&1
上面这个 Cron 会每分钟调用一次 Laravel 命令调度器。执行 schedule:run
命令时, Laravel 会根据你的调度运行预定任务。
如果任务多不方便在AppConsoleKernel
的schedule
方法中写,可以使用命令调度
一、创建 Command 文件
项目目录下输入命令php artisan make:command TmallCollectCount
即在(app/Console/Commands 下创建了 TmallCollectCount.php 文件)
并完善 Command 信息
- 签名
protected $signature = 'TmallCollectCount';
- 描述
protected $description = 'tmall collectcounts collect';
- 在 handle() 方法中实现功能(操作数据库只能用DB,不能用ORM)
public function handle()
{
$products= DB::table('tmall_products')-\>get();
foreach ($products as $product) {
$collectnum = CollectCount::collectCount($product-\>skuid);
DB::table('collect_counts')-\>insert(
['tproduct_id' =\> $product-\>id, 'collect_count' =\> $collectnum,'count_date'=\>date("Y-m-d H:i:s")]()
);
}
}
二、在 Kernel.php 中注册命令并填写执行计划
- 注册命令
protected $commands =
\App\Console\Commands\TmallCollectCount::class,
];
2、填写执行计划(每周一凌晨执行统计)
protected function schedule(Schedule $schedule)
{
$schedule-\>command('TmallCollectCount')-\>weekly()-\>mondays()-\>at("00:00:00");
}
调度周期等详细信息请看laravel 文档:
https://laravel-china.org/docs/laravel/5.5/scheduling
可参考文章:
网友评论