Rumah >rangka kerja php >Laravel >Penjelasan terperinci tentang penggunaan dan prinsip tugas berjadual laravel
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.
[Cadangan berkaitan: tutorial video laravel]
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.
Konfigurasi crontab pertama:
* * * * * php artisan schedule:run >> /dev/null 2>&1
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'); //日志输出,默认覆盖先前日志 }}
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';
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', ]); }
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']);}
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)); }
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); } }
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 );}
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); }
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 &' ); }
Selain kaedah di atas, kita juga boleh. gunakan tugas berjadual laravel untuk memanggil arahan Shell:
$schedule->exec('node /home/forge/script.js')->daily();
Anda juga boleh menggunakan penutupan untuk penjadualan:
$schedule->call(function () { DB::table('recent_users')->delete();})->daily();
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!