關於定時任務的一些雜談

小胖子呀萌萌噠發表於2021-01-14

關於定時任務的一些步驟。
前幾天寫了個佇列來實現運營定時推送任務的功能,被leader噴了,原話是laravel的佇列效能不好。於是請教了另一位前輩,據說,只需把laravel的佇列實現底層邏輯由陣列改為雙向連結串列即可。我尋思著,那我特麼還不如改定時!

  1. 建立定時檔案
    #生成定時任務的檔案
    php artisan make:command JPushJobs

    注意:建立檔案一般為make語句,用php artisan檢視,建立定時任務:make:command 建立佇列:make:job 建立事件:make:event 建立控制類:make:controller 生成頻道:make:channel 等等

生成的定時檔案內容如下所示

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class JPushJobs extends Command
{
    /**
     * The name and signature of the console command.這裡為定時任務的簽名,根據這裡的定義呼叫定時任務為:php artisan j-push:jobs
     *
     * @var string
     */
    protected $signature = 'j-push:jobs';

    /**
     * The console command description.這裡是在php artisan裡的命令描述
     *
     * @var string
     */
    protected $description = '後臺定時推送的任務';
    protected $pushInfoService;

    /**
     * Create a new command instance.
     * JPushJobs constructor.
     * @param PushInfoService $pushInfoService
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
       //此處增加相關處理邏輯
    }
}
  1. 將定時任務加入Kernel管理
    在Kernel.php檔案中加入上一步定義好的定時任務,如下

    // 每分鐘執行一次任務
    $schedule->command('j-push:jobs')->everyMinute();

    注意:command裡放定時任務的簽名,即定時任務中$signature的定義。其中everyMinute()表示此任務每分鐘執行一次,如果是其他時間可以用其他方法,比如 每小時執行一次hourly()、每天凌晨4點執行一次dailyAt('4:00')、自定義比如每兩小時執行一次cron('0 */2 * * *')

  2. 也可以直接將定時任務放入linux的定時任務管理
    命令後crontab -e進入定時任務管理指令碼,然後加入管理語句

#將/your-project替換成你的專案目錄
*/1 * * * * php /your-project/artisan j-push:jobs

注意:定時任務是一個掛載在後臺的獨立的程式,不需要像佇列一樣在方法中呼叫

本作品採用《CC 協議》,轉載必須註明作者和本文連結
我家有貓了