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()方法。