本文共 1518 字,大约阅读时间需要 5 分钟。
laravel任务调度
替代linux的cron来管理定时任务。
一、app/Console/Kernel.php
command('Read3SuccessStat')->everyMinute()->runInBackground()->withoutOverlapping(); /** * 任务只运行在一台服务器上 * 避免任务重复(默认24小时) * -- 每五分钟 */ $schedule->command('Read3DepartRank')->everyFiveMinutes()->runInBackground()->withoutOverlapping(); /** * 任务只运行在一台服务器上 * 避免任务重复(默认24小时) * -- 每五分钟 */ $schedule->command('Read3ActivityBookOver')->everyFiveMinutes()->runInBackground()->withoutOverlapping(); }}
二、app/Console/Commands/Read3SuccessStat.php
_readRepository = $readRepository; } /** * Execute the console command. * * @return mixed */ public function handle() { $this->_readRepository->read3SuccessStat(); }}
三、app/RepositoryInterface/Read3RepositoryInterface.php
五、测试
CMDd:cd D:\dev\php\magook\trunk\server\dbserverWorkSpace\opDbserverphp 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()方法。
转载地址:http://ggxui.baihongyu.com/