關(guān)于laravel5.5的定時(shí)任務(wù)詳解(demo)
一、準(zhǔn)備環(huán)境
服務(wù)器:linux(debian)+nginx+mysql+php 環(huán)境
框架:laravel 5.5 (確認(rèn)能跑通)
需求:每天晚上1點(diǎn)執(zhí)行定時(shí)操作
二、定時(shí)任務(wù)的步驟
1、根據(jù)文檔,創(chuàng)建命令
首先進(jìn)入到laravel/app/console 目錄下,Console 目錄包含應(yīng)用所有自定義的 Artisan 命令,這些命令類可以使用 make:command 命令生成。該目錄下還有 Console/Kernel 類,在這里可以注冊(cè)自定義的 Artisan 命令以及定義調(diào)度任務(wù)。
例如我們創(chuàng)建一個(gè)定時(shí)任務(wù),名稱為T(mén)est:
//這里使用laravel給定的 php artisan來(lái)生成命令,此處的Test就是我們要生成的文件 //這里的artisan代表的不僅僅是laravel自帶的命令,他其實(shí)是laravel下的artisan目錄,因?yàn)檫@個(gè)目錄沒(méi)有x,也就是可執(zhí)行權(quán)限,所以不能使用 ./artisan 來(lái)執(zhí)行,只能通過(guò)php來(lái)執(zhí)行 php artisan make:command Test
2、創(chuàng)建完之后,打開(kāi)console目錄下的commands目錄,我們會(huì)發(fā)現(xiàn)里面已經(jīng)有了一個(gè)文件
大致的代碼如下:
<?php namespace App\Console\Commands; use App\Services\CalculateDataService; use Illuminate\Console\Command; class Test extends Command { //此處代表laravel自動(dòng)生成的名稱,下面執(zhí)行的時(shí)候能用到 protected $signature = 'test:data'; //此處代表的是描述,并沒(méi)有什么用的 protected $description = 'test data'; /** * 計(jì)算數(shù)據(jù)服務(wù)的 service 屬性 *這里由于要用到我們的邏輯,所以提前定義一下,方便下面使用 * @var CalculateDataService */ protected $service; //這個(gè)是laravel自帶的構(gòu)造方法。初始狀態(tài)下是空的。 //我這里由于要調(diào)用CalculateDataService 類的一個(gè)方法,所有就用依賴注入的方式引入了一下。 public function __construct(CalculateDataService $service) { parent::__construct(); $this->service = $service; } /** * Execute the console command. *這里就是我們執(zhí)行操作的地方,里面是command要處理的業(yè)務(wù)。根據(jù)我們的需求, *調(diào)用類中的calculateData()方法,該方法是我們自己的需求邏輯部分。 * @return mixed */ public function handle() { try { $this->service->calculateData(); } catch (\Exception $e) { $this->error($e->getMessage()); } // line()方法是command類中自帶的方法,可以輸出我們自定義的信息 $this->line('calculate Data Success!'); } }
3、定時(shí)命令創(chuàng)建好之后,我們需要修改kernel.php文件
kernel.php文件里面,主要是定義命令的調(diào)度時(shí)間,定義命令的執(zhí)行先后順序等。
這部分參考laravel官方文檔:
http://laravelacademy.org/post/8484.html
4、我的kernel.php文件
<?php //此處省略了命名空間部分 class Kernel extends ConsoleKernel { /** * The Artisan commands provided by your application. *注:此處是引入我們新創(chuàng)建的類。由于我們此處是使用命令名來(lái)操作的,所以沒(méi)用上這個(gè)類名。不過(guò)還是引入比較標(biāo)準(zhǔn) * 可以使用 command 方法通過(guò)命令名或類來(lái)調(diào)度一個(gè) Artisan 命令: * $schedule->command('emails:send --force')->daily(); * $schedule->command(EmailsCommand::class, ['--force'])->daily(); * * @var array */ protected $commands = [ Test::class, CalculateData::class, UpdateOffset::class, ]; /** * Define the application's command schedule. * 注: * 1、這個(gè)方法按照自己的需求,確定定時(shí)方法的執(zhí)行順序。通過(guò)after,before等關(guān)鍵詞來(lái)控制 * 2、此處相當(dāng)于規(guī)定同意的定時(shí)執(zhí)行時(shí)間,如都在0:30分執(zhí)行下面的幾個(gè)定時(shí)任務(wù) * @param \Illuminate\Console\Scheduling\Schedule $schedule * @return void */ protected function schedule(Schedule $schedule) { // 每天凌晨 0.45 執(zhí)行同步 aliyun 數(shù)據(jù)的任務(wù),并發(fā)送郵件給 *** $schedule->command('iot:sync Flow') ->after(function() { //更新偏移量,after里面不能加參數(shù) Artisan::call('Test:data'); }) ->after(function () { // 執(zhí)行同步數(shù)據(jù)命令完成后 則執(zhí)行計(jì)算數(shù)據(jù)任務(wù) Artisan::call('calculate:data'); }); } /** * Register the commands for the application. * //這個(gè)部分是laravel自動(dòng)生成的,引入我們生成的命令文件 * @return void */ protected function commands() { $this->load(__DIR__.'/Commands'); require base_path('routes/console.php'); } }
關(guān)于具體的調(diào)度方法schedule(),大家可以去laravel文檔看看,里面可以規(guī)定很多東西。我這邊是使用的鉤子函數(shù)。在同時(shí)要執(zhí)行多個(gè)定時(shí)任務(wù)的時(shí)候,通過(guò)after,before等方法,可以讓多個(gè)定時(shí)任務(wù)變得有序起來(lái)。
三、執(zhí)行我們的定時(shí)
雖然laravel的定時(shí)任務(wù)一直都說(shuō)的很強(qiáng)大,但本質(zhì)上還是離不開(kāi)服務(wù)器上的cron腳本。。
1、先查看服務(wù)器上的定時(shí)條目
crontab -l
2、新增或編輯cron 條目
crontab -e
3、在里面新增我們寫(xiě)好的方法路徑
這里面新加上我們的定時(shí)任務(wù)。
第一是 規(guī)定定時(shí)任務(wù)的執(zhí)行時(shí)間
第二是 要把項(xiàng)目的artisan目錄路徑寫(xiě)對(duì)
第三 schedule:run就是執(zhí)行咱們之前寫(xiě)的任務(wù)調(diào)度,也就是kernel.php文件中的schedule方法。
如果是大家自己測(cè)試的話,可以隨便寫(xiě)個(gè)定時(shí)任務(wù),每分鐘執(zhí)行以下,這樣就能準(zhǔn)確的知道自己的定時(shí)任務(wù)是否正確了。
以上這篇關(guān)于laravel5.5的定時(shí)任務(wù)詳解(demo)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
laravel使用Faker數(shù)據(jù)填充的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于laravel使用Faker數(shù)據(jù)填充的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用laravel具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04PHP實(shí)現(xiàn)登錄驗(yàn)證碼校驗(yàn)功能
這篇文章主要為大家詳細(xì)介紹了PHP實(shí)現(xiàn)驗(yàn)證碼校驗(yàn)功能,主要是利用PHP中的 SESSION功能來(lái)實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05來(lái)自經(jīng)典的打造簡(jiǎn)單的PHP&MYSQL留言板
比較簡(jiǎn)單易懂的php+mysql留言板 數(shù)據(jù)庫(kù)結(jié)構(gòu):(庫(kù)名:lyb)2008-03-03php從數(shù)據(jù)庫(kù)中讀取特定的行(實(shí)例)
下面小編就為大家?guī)?lái)一篇php從數(shù)據(jù)庫(kù)中讀取特定的行(實(shí)例)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06php實(shí)現(xiàn)微信企業(yè)轉(zhuǎn)賬功能
這篇文章主要為大家詳細(xì)介紹了php實(shí)現(xiàn)微信企業(yè)轉(zhuǎn)賬功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10yii 框架實(shí)現(xiàn)按天,月,年,自定義時(shí)間段統(tǒng)計(jì)數(shù)據(jù)的方法分析
這篇文章主要介紹了yii 框架實(shí)現(xiàn)按天,月,年,自定義時(shí)間段統(tǒng)計(jì)數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了yii基于自定義時(shí)間段統(tǒng)計(jì)數(shù)據(jù)的相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下2020-04-04