laravel任务调度

50 篇文章 2 订阅

laravel任务调度

替代linux的cron来管理定时任务。

一、app/Console/Kernel.php

<?php

namespace App\Console;

use App\Console\Commands\Read3DepartRank;
use App\Console\Commands\Read3SuccessStat;
use App\Console\Commands\Read3ActivityBookOver;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Support\Carbon;
use Laravel\Lumen\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
    protected $commands = [
        Read3SuccessStat::class,
        Read3DepartRank::class,
        Read3ActivityBookOver::class,
    ];

    protected function schedule(Schedule $schedule)
    {
        /**
         * 任务只运行在一台服务器上
         * 避免任务重复(默认24小时)
         * -- 每分钟
         */
        $schedule->command('Read3SuccessStat')->everyMinute()->runInBackground()->withoutOverlapping();

        /**
         * 任务只运行在一台服务器上
         * 避免任务重复(默认24小时)
         * -- 每五分钟
         */
        $schedule->command('Read3DepartRank')->everyFiveMinutes()->runInBackground()->withoutOverlapping();

        /**
         * 任务只运行在一台服务器上
         * 避免任务重复(默认24小时)
         * -- 每五分钟
         */
        $schedule->command('Read3ActivityBookOver')->everyFiveMinutes()->runInBackground()->withoutOverlapping();
    }
}

二、app/Console/Commands/Read3SuccessStat.php

<?php

namespace App\Console\Commands;


use App\RepositoryInterface\Read3RepositoryInterface;
use Illuminate\Console\Command;

class Read3SuccessStat extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'Read3SuccessStat';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = '每分钟排查一下';

    private $_readRepository;

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct(Read3RepositoryInterface $readRepository)
    {
        parent::__construct();
        $this->_readRepository = $readRepository;
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $this->_readRepository->read3SuccessStat();
    }
}

三、app/RepositoryInterface/Read3RepositoryInterface.php

<?php

namespace App\RepositoryInterface;

interface Read3RepositoryInterface
{
	public function read3SuccessStat();
}

四、接口的实现
app/Repository/Read3Repository.php

<?php
namespace App\Repository;

use Illuminate\Support\Facades\Log;
class Read3Repository implements Read3RepositoryInterface
{
	public function read3SuccessStat(){
		// 需要设置
		set_time_limit(0);
        ini_set('memory_limit', '2048M');
		Log::info('here');
	}
}

五、测试
CMD

d:
cd D:\dev\php\magook\trunk\server\dbserverWorkSpace\opDbserver
php artisan schedule:run

默认laravel会将输出重定向到 NUL,也就是看不到,当然可以设置到其他地方。

六,线上Linux
设置Crontab,是系统每分钟调一次这个命令

* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

注意的点:
1、laravel任务调度的原理是,每分钟检查一次所有的任务是否达到执行时间,如果达到了就放入执行队列执行,而且,实际上是顺序执行的,并不是并行的,这点和Linux自带的cron不同,显然这样是有问题的,我们需要的是并行的,因为如果上一个任务执行时间比较长,那么后面的任务就不是按时执行了,因此Laravel提供了任务以后台进程的方式来执行的设置,这样每个任务都同时独立运行,因此我们要加上runInBackground()方法 。当然,在本地windows调试的话可以不用加了。

2、定时任务最大的弊端是间隔时间的设置,因为不好精确知道脚本的执行时间,设置短了,可能同一个任务不止一个进程在跑,这样会导致数据混乱,时间设置太长了,又没有充分利用系统资源,于是Laravel提供了一个加锁的机制,确保同一个任务不会被多个进程执行,因此我们要加上withoutOverlapping()方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值