Rumah > rangka kerja php > Laravel > Penjelasan terperinci tentang penggunaan dan prinsip tugas berjadual laravel

Penjelasan terperinci tentang penggunaan dan prinsip tugas berjadual laravel

WBOY
Lepaskan: 2022-05-30 20:51:11
ke hadapan
5621 orang telah melayarinya

Artikel ini membawakan anda pengetahuan yang berkaitan tentang laravel Ia terutamanya memperkenalkan penggunaan dan prinsip tugasan berjadual Ia juga menerangkan isu berkaitan tugasan berjadual mengikut senario aplikasi. Saya harap ia akan membantu semua orang.

Penjelasan terperinci tentang penggunaan dan prinsip tugas berjadual laravel

[Cadangan berkaitan: tutorial video laravel]

Senario aplikasi

Sistem tapak web selalunya mempunyai banyak Berjadual tugas perlu dilaksanakan. Contohnya, mesej langganan tolak, data berkaitan statistik, dsb. Linux biasanya menggunakan crontab untuk menyediakan dan mengurus tugasan berjadual Walau bagaimanapun, apabila bilangan tugasan meningkat, mengurus tugasan berjadual menjadi lebih rumit dan terdedah kepada kekeliruan pengurusan. Penyelesaian Laravel untuk masalah ini adalah dengan menyediakan hanya satu tugas berjadual dalam perniagaan diproses dan dinilai berdasarkan tugas berjadual ini, merealisasikan pengurusan tugas berjadual di peringkat kod.

Penggunaan asas

Konfigurasi crontab pertama:

* * * * * php artisan schedule:run >> /dev/null 2>&1
Salin selepas log masuk

Perkara di atas bermaksud untuk menetapkan tugas yang dijadualkan untuk dilaksanakan setiap minit Konfigurasi perniagaan khusus diletakkan dalam jadual AppConsoleKernel Dalam kaedah:

class Kernel extends ConsoleKernel{
    Protected function schedule(Schedule $schedule)
    {
                //综合数据统计
        $schedule->command('complex_data_log')
        ->everyMinute() //每分钟执行一次(除此之外还有,每五、十、十五、三十...,不同方法设置的默认时间不同)
        ->withoutOverlapping() //防止重复执行
        ->onOneServer() //在单台服务器上跑
        ->runInBackground() //任务后台运行
        //->appendOutputTo('log_path')//日志输出,默认追加
        ->sendOutputTo('log_path'); //日志输出,默认覆盖先前日志
    }}
Salin selepas log masuk

Analisis prinsip:

Prinsip asas:
schedule:run Spesifikasi ini ditakrifkan dalam vendorilluminateconsoleSchedulingScheduleRunCommand, dalam kelas bentuk definisi Sama seperti tugasan berjadual umum:

/**
 * The console command name.
 *
 * @var string
 */protected $name = 'schedule:run';
Salin selepas log masuk

Apabila laravel menghuraikan arahan, kelas ScheduleRunCommand digabungkan dengan tatasusunan arahan dalam kelas Kernel:

	/**
     * Get the commands to add to the application.
     *
     * @return array
     */
    protected function getCommands()
    {
        return array_merge($this->commands, [
            'Illuminate\Console\Scheduling\ScheduleRunCommand',
        ]);
    }
Salin selepas log masuk

Jadi php artisan schedule Perintah :run ialah arahan terbina dalam rangka kerja.
Apabila arahan dimulakan, ia akan mencari kaedah pemegang dalam kelas secara lalai untuk pelaksanaan:

/** vendor\illuminate\console\Command.php
 * Execute the console command.
 * 
 * @param  \Symfony\Component\Console\Input\InputInterface  $input
 * @param  \Symfony\Component\Console\Output\OutputInterface  $output
 * @return mixed
 */protected function execute(InputInterface $input, OutputInterface $output){
    return $this->laravel->call([$this, 'handle']);}
Salin selepas log masuk

php artisan schedule:run command akan mengimbas semua arahan yang didaftarkan dalam Kernel::schedule setiap minit , dan Tentukan sama ada arahan telah mencapai kitaran pelaksanaan Jika sudah, tolaknya ke dalam baris gilir menunggu:

    /**
     * Schedule the event to run every minute.
     * 代码每分钟执行一次
     * @return $this
     */
    public function everyMinute()
    {
        return $this->spliceIntoPosition(1, '*');
    }
    
    /**
     * Splice the given value into the given position of the expression.
     * 拼接定时任务表达式
     * @param  int  $position
     * @param  string  $value
     * @return $this
     */
    protected function spliceIntoPosition($position, $value)
    {
        $segments = explode(' ', $this->expression);

        $segments[$position - 1] = $value;

        return $this->cron(implode(' ', $segments));
    }
Salin selepas log masuk

ScheduleRunCommand::handle function:

/**
     * Execute the console command.
     * 
     * @return void
     */
    public function handle()
    {
        foreach ($this->schedule->dueEvents($this->laravel) as $event) {
            if (! $event->filtersPass($this->laravel)) {
                continue;
            }
            $this->runEvent($event);
        }
    }
Salin selepas log masuk

untuk mengelakkan pertindihan tugas:
Kadangkala masa pelaksanaan satu tugasan yang dijadualkan terlalu lama Selepas masa pelaksanaan seterusnya, tugas pelaksanaan terakhir belum selesai Pada masa ini, kita boleh menggunakan withoutOverlapping(). kaedah untuk mengelakkan pertindihan tugas. Dalam kaedah tanpaBertindih, kunci tugasan yang sepadan (perkara yang sama berlaku untuk kaedah onOneServer):

public function create(Event $event){
    return $this->cache->store($this->store)->add(
        $event->mutexName(), true, $event->expiresAt
    );}
Salin selepas log masuk

Hanya apabila kunci tugasan yang sepadan diperolehi barulah tugas itu dilaksanakan:

/**
     * Run the given event.
     * 运行任务
     * @param  \Illuminate\Contracts\Container\Container  $container
     * @return void
     */
    public function run(Container $container)
    {
        if ($this->withoutOverlapping &&
            ! $this->mutex->create($this)) {
            return;
        }
        
        //判断是否是后台运行
        $this->runInBackground
                    ? $this->runCommandInBackground($container)
                    : $this->runCommandInForeground($container);
    }
Salin selepas log masuk

Latar belakang tugas berjalan:
Memandangkan tugasan berjadual dilaksanakan mengikut turutan, masa pelaksanaan tugas sebelumnya terlalu lama, yang akan menjejaskan masa pelaksanaan tugas seterusnya, jadi kita boleh menggunakan kaedah runInBackground untuk meletakkan tugas di latar belakang untuk pelaksanaan Agak serupa dengan peranan & dalam shell:

/**
     * Build the command for running the event in the background.
     * 构建定时任务后台运行语句
     * @param  \Illuminate\Console\Scheduling\Event  $event
     * @return string
     */
    protected function buildBackgroundCommand(Event $event)
    {
        $output = ProcessUtils::escapeArgument($event->output);

        $redirect = $event->shouldAppendOutput ? ' >> ' : ' > ';

        $finished = Application::formatCommandString('schedule:finish').' "'.$event->mutexName().'"';

        return $this->ensureCorrectUser($event,
            '('.$event->command.$redirect.$output.' 2>&1 '.(windows_os() ? '&' : ';').' '.$finished.') > '
            .ProcessUtils::escapeArgument($event->getDefaultOutput()).' 2>&1 &'
        );
    }
Salin selepas log masuk

Kegunaan lain:

Selain kaedah di atas, kita juga boleh. gunakan tugas berjadual laravel untuk memanggil arahan Shell:

$schedule->exec('node /home/forge/script.js')->daily();
Salin selepas log masuk

Anda juga boleh menggunakan penutupan untuk penjadualan:

$schedule->call(function () {
    DB::table('recent_users')->delete();})->daily();
Salin selepas log masuk

Jika anda ingin mengetahui lebih lanjut tentang cara menggunakannya, anda boleh menyemak keluar dokumentasi laravel:

https://laravelacademy.org/post /19517.html

[Cadangan berkaitan: tutorial video laravel]

Atas ialah kandungan terperinci Penjelasan terperinci tentang penggunaan dan prinsip tugas berjadual laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:csdn.net
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan