亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Laravel 技巧之 定時任務

keithyau / 1401人閱讀

摘要:對于定時任務的基本用法,官網文檔已經描述得很詳細了,這里不再多說。這種情況下如果定時任務能夠并行執(zhí)行,就不會有這樣的問題。這個時候我們希望能夠像隊列那樣,將定時任務分散到多臺服務器上。

定時任務 Scheduled Tasks 是 Laravel 提供的組件之一,稍微上點規(guī)模的項目應該都會用到,比如開發(fā)微信應用時通過定時任務去刷新access token,比如每天定時發(fā)推送提現用戶要記得簽到。對于定時任務的基本用法,官網文檔已經描述得很詳細了,這里不再多說。

本文主要是介紹定時任務在實際應用中的兩個小技巧:

1. 多個任務并行執(zhí)行

先簡單介紹一下 Laravel 定時任務組件的基本原理:

當cli初始化完畢之后,系統(tǒng)會調用 AppConsoleKernel::schedule 方法,也就是我們定義定時任務列表的地方,這個方法里每調用一次 $schedule->command() 就會生成一個 IlluminateConsoleSchedulingEvent 對象并保存在 $schedule->events 數組里。當執(zhí)行 php artisan scheduled:run 時,系統(tǒng)會遍歷 $schedule->events,把當前時間需要執(zhí)行的任務放在一個集合中,最后依次 串行執(zhí)行 這些任務。

這樣做在大多數情況下是沒有問題的,但有一些特殊的情況,比如在每個月的第一天要給100W個用戶發(fā)送郵件,同一批次的定時任務必須等到這些郵件全部發(fā)送完畢之后才會被執(zhí)行,假如這些任務里有對執(zhí)行時間十分敏感的任務,比每5分鐘一次的數據快照,就會導致那個時間點數據的缺失。

這種情況下如果定時任務能夠并行執(zhí)行,就不會有這樣的問題。Laravel 實際上提供了解決方案,但很奇怪文檔里面并沒有提到,就是 runInBackground 方法,在定義定時任務時 $schedule->command("foo:bar")->everyMinutes()->runInBackground(); 就可以了。

2. 負載均衡

隨著業(yè)務邏輯的增多,定時任務也會越來越多,定時任務服務器的負載也會越來越高,甚至導致任務執(zhí)行緩慢,然而我們卻只能在一臺服務器上設置定時任務,如果在多臺服務器上同時配置了定時任務,還會導致定時任務的重復執(zhí)行。這個時候我們希望能夠像隊列那樣,將定時任務分散到多臺服務器上。

截止 v5.4.15,Laravel 還沒有提供內置方案來解決這個問題,但只需要簡單的改造就可以實現我們需要的效果。首先我們把將每個定時任務里 handle 方法提取出來創(chuàng)建一個新的Job并繼承 ShouldQueue,然后在定時任務的 handle 里直接 dispatch 對應的Job即可,這樣原本的業(yè)務邏輯就會被隊列處理掉,當系統(tǒng)有多臺服務器在處理隊列時,也就實現了我們需要的負載均衡。

但是這樣畢竟還是麻煩,每個定時任務都要創(chuàng)建一個Command和一個Job,太費勁,于是我提交了一個 Proposal ,目前已經實現并且merge入5.4分支,相信下個版本大家就能用上了。用法也很簡單,只需要創(chuàng)建一個繼承 ShouldQueue的Job,然后在AppConsoleKernel::schedule 方法里定義

$schedule->job(new FooBarJob())->everyMinutes();

就可以了

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://www.ezyhdfw.cn/yun/22487.html

相關文章

  • 高性能千萬級定時任務管理服務forsun laravel插件使用詳解

    摘要:高性能高精度定時服務,輕松管理千萬級定時任務。支持任務到期觸發(fā)和。支持創(chuàng)建延時任務和定時到期任務,和原生保持相同接口,輕松使用。不支持任務輸出任務鉤子及維護模式。是不指定任務名時自動生成,每個任務名必須唯一,相同任務名重復定義將會自動覆蓋。 Forsun高性能高精度定時服務,輕松管理千萬級定時任務。 定時服務項目地址:https://github.com/snower/forsun l...

    Muninn 評論0 收藏0
  • 創(chuàng)業(yè)初期數據庫云備份laravel解決方案

    摘要:在中注冊發(fā)布之后,我們會產生一個監(jiān)聽器,文件已經存儲在本地,獲取該文件信息將文件上傳至七牛云存入數據庫上面的部分代碼沒寫,大家可以去自己去試下,加深對七牛云及的理解,完全可以達到目的。 最近項目用戶徒增,購買的服務器還是和公司另外一個項目共用的同一臺服務器,想著要是服務器崩了,還沒個容災方案,萬一。。。不得被用戶整死 選用方案 laravel-backup 配合laravel的任務調...

    2bdenny 評論0 收藏0
  • Laravel 5.7 最佳實踐和開發(fā)技巧分享

    摘要:當查詢數據時,本地范圍允許我們創(chuàng)建自己的查詢構造器鏈式方法。這樣便會知道這是一個本地范圍并且可以在查詢構造器中使用。某些查詢構造器不可用或者說可用但是方法名不同,關于這些請查閱所有集合的方法。 showImg(https://segmentfault.com/img/remote/1460000017877956?w=800&h=267); Laravel 因可編寫出干凈,可用可調試的...

    ninefive 評論0 收藏0
  • Laravel 執(zhí)行用戶自定義的定時任務

    摘要:原文來自問題在中,如果我們想使用定時任務的話,對應我們開發(fā)人員來說非常簡單,只需要參照官網的定時任務文檔基本就可以實現了??偨Y以上就簡單實現了執(zhí)行用戶自定義定時任務的需求。 原文來自 https://www.codecasts.com/blo... 問題 在 Laravel 中,如果我們想使用定時任務的話,對應我們開發(fā)人員來說非常簡單,只需要參照官網的定時任務文檔基本就可以實現了。 然...

    izhuhaodev 評論0 收藏0
  • 個人整理, 閱讀過的好文章 (每天隨時更新)

    摘要:大家有好的文章可以在評論下面分享出來共同進步本文鏈接數組使用之道程序員進階學習書籍參考指南教你在不使用框架的情況下也能寫出現代化代碼巧用數組函數框架中間件實現沒錯,這就是面向對象編程設計模式需要遵循的個基本原則令人困惑的在中使用協(xié)程實現多任 大家有好的文章,可以在評論下面分享出來, 共同進步! 本文github鏈接 php PHP 數組使用之道 PHP程序員進階學習書籍參考指南 教你...

    Chiclaim 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<