最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

laravel異步監(jiān)控定時調(diào)度器實例詳解

 更新時間:2019年06月21日 08:42:46   作者:低調(diào)的碼農(nóng)  
這篇文章主要給大家介紹了關(guān)于laravel異步監(jiān)控定時調(diào)度器的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用laravel具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

定時調(diào)度器是什么

laravel默認提供了一個命令定時任務(wù)的功能,在其他的php框架下面,沒有這個定時任務(wù),我們要跑一些異步腳本怎么操作呢,只能依賴我們系統(tǒng)提供的crontab來做,這就導致我們每次發(fā)版本新增定時任務(wù)都要去服務(wù)器更改crontab代碼,獲取更新這個配置。

執(zhí)行命令是php artisan schedule:run 來執(zhí)行,那放在哪里執(zhí)行呢,沒錯這個調(diào)起還是需要依賴我們crontab來執(zhí)行,但是只需要配置一次,后續(xù)所有定時任務(wù)都在我們業(yè)務(wù)代碼進行控制

場景

我們有一個導入數(shù)據(jù)的定時任務(wù)

//每分鐘導入庫數(shù)據(jù)
$schedule->command(self::SIGNATURE)->withoutOverlapping()->everyMinute()->runInBackground();

這里導入長時間最好使用runInBackground(),表示異步執(zhí)行,其實就是在shell腳本的末尾加上 & 符號,在linux上完全依賴系統(tǒng)的方式完成。

這里使用了withoutOverlapping() 表示在同一時刻只能有一個任務(wù)執(zhí)行,主要邏輯使用的是排它鎖實現(xiàn),依賴于我們cache的driver,我這里使用的是redis,后面作為鎖的過期直接redis提供的key過期來做。

出現(xiàn)問題

這個任務(wù)在正常情況下都是非常完美的,因為同一時刻只有一個再跑,跑完就可以,但是一個場景出現(xiàn)
有一天我們的qa同學剛部署環(huán)境后,我們服務(wù)端就在默默的導入庫了,因為使用withoutOverlapping($expire_at=1440)這個時候在redis就有一個鎖產(chǎn)生了,這個默認帶參數(shù)是鎖的過期時間,默認是一天,然后因為我們docker環(huán)境需要更改參數(shù)然后進行后端server服務(wù)的重啟,我們重啟也是比較暴力,就是直接發(fā)送kill的信號,導致所有在里面跑的進程瞬間kill,而這時候我們的redis的鎖缺還存在,而且是1440分鐘左右,那當我們server再啟動后,發(fā)現(xiàn)鎖一直存在,沒辦法進行后續(xù)的操作了,只能等著。

解決

那我把鎖的時間減少行不行,原來1天,我改成30分鐘,沒問題,開始第一版方案我們也是這樣做,官方也是可以這樣做的。

后來我們一想,能否做到一個監(jiān)控程序呢,進程退出后立馬監(jiān)控到過期呢,這樣就不用固定一個時間,這當然是所有軟件開發(fā)者理想狀態(tài):要你開你就開,我掛了鎖也就去掉了,不論正常與否。

解決方案

說明:

  • 這里命令啟動時候,獲取進程的pid,然后fork子進程,可以將這個pid傳遞給子進程。
  • 子進程每隔10s進行一個探活,獲取父進程的id與傳入的pid是否一致,這里普及一個知識點,如果父進程異常退出,這個子進程未退出就會被init進程(pid=1)接管,那么這就是一個孤兒進程。
  • 同時子進程每次探活的時候就會更改redis的鎖的過期時間,如果探活時間間隔是10s,那么我們的過期時間設(shè)置就是14s,多冗余一點時間。

代碼實現(xiàn)

代碼實現(xiàn)總是那么蒼白無力哈,這里就寫一個laravel的擴展來做,好處就是不影響我們主體的任何代碼就完成了,我們的laravel可以隨意升級。

github地址:github.com/zzh78727258

composer地址:packagist.org/packages/ze

總結(jié)

整體實現(xiàn)沒有使用判斷進程是否存在的ps grep等命令,因為我們docker環(huán)境不一定支持這些命令,只是用簡單的pid與parent_id做對比。

laravel的在命令開始于結(jié)束都進行鉤子方式,我們在Listener下面進行監(jiān)聽即可

public function subscribe($events)
 {
  $events->listen(
   [
    CommandStarting::class, // 命令開始的時候
   ],
   __CLASS__ . '@handle'
  );
 }

整體代碼是基于laravel擴展化的,不會影響laravel的升級操作。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • PHP微信支付實例解析

    PHP微信支付實例解析

    這篇文章主要為大家詳細介紹了PHP微信支付實例,包括PHP微信支付源碼,PHP微信退款源碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-07-07
  • CodeIgniter記錄錯誤日志的方法全面總結(jié)

    CodeIgniter記錄錯誤日志的方法全面總結(jié)

    這篇文章主要介紹了CodeIgniter記錄錯誤日志的方法,詳細分析了CodeIgniter框架的文件結(jié)構(gòu)與相應(yīng)的功能,結(jié)合實例分析了CodeIgniter框架記錄錯誤日志的實現(xiàn)技巧,并分析了隱藏index文件與數(shù)據(jù)傳輸?shù)燃记?總結(jié)非常全面,需要的朋友可以參考下
    2016-05-05
  • ThinkPHP中url隱藏入口文件后接收alipay傳值的方法

    ThinkPHP中url隱藏入口文件后接收alipay傳值的方法

    這篇文章主要介紹了ThinkPHP中url隱藏入口文件后接收alipay傳值的方法,可實現(xiàn)針對第三方接口的URL地址中的?進行轉(zhuǎn)換處理,是非常實用的技巧,需要的朋友可以參考下
    2014-12-12
  • PHP分頁初探 一個最簡單的PHP分頁代碼的簡單實現(xiàn)

    PHP分頁初探 一個最簡單的PHP分頁代碼的簡單實現(xiàn)

    下面小編就為大家?guī)硪黄狿HP分頁初探 一個最簡單的PHP分頁代碼的簡單實現(xiàn)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • JieqiCMS 杰奇1.5注冊機php源碼

    JieqiCMS 杰奇1.5注冊機php源碼

    杰奇1.5注冊機php源碼,大家可以看下代碼。
    2009-08-08
  • Yii 訪問 Gii(腳手架)時出現(xiàn) 403 錯誤

    Yii 訪問 Gii(腳手架)時出現(xiàn) 403 錯誤

    這篇文章主要介紹了Yii 訪問 Gii(腳手架)時出現(xiàn) 403 錯誤的解決方法的相關(guān)資料,需要的朋友可以參考下
    2018-06-06
  • Yii不依賴Model的表單生成器用法實例

    Yii不依賴Model的表單生成器用法實例

    這篇文章主要介紹了Yii不依賴Model的表單生成器用法,以實例形式對比分析了不依賴Model的表單生成器實現(xiàn)方法,是非常實用的技巧,需要的朋友可以參考下
    2014-12-12
  • PHPUnit安裝及使用示例

    PHPUnit安裝及使用示例

    PHPUnit是一個用PHP編程語言開發(fā)的開源軟件,是一個單元測試框架。PHPUnit由Sebastian Bergmann創(chuàng)建,源于Kent Beck的SUnit,是xUnit家族的框架之一。本文將介紹PHPUnit的安裝方法以及一則使用示例。
    2014-10-10
  • PHP文件上傳、客戶端和服務(wù)器端加限制、抓取錯誤信息、完整步驟解析

    PHP文件上傳、客戶端和服務(wù)器端加限制、抓取錯誤信息、完整步驟解析

    文件上傳分為兩個部分,HTML顯示部分和PHP處理部分。這篇文章主要介紹了PHP文件上傳、客戶端和服務(wù)器端加限制、抓取錯誤信息、完整步驟解析,需要的朋友參考下吧
    2017-01-01
  • PHP與SQL語句常用大全

    PHP與SQL語句常用大全

    很多朋友不清楚php中sql查詢語句的id=%d的意思,今天小編通過本文給大家詳細介紹下PHP中SQL查詢語句的id=%d解釋,需要的朋友參考下吧
    2016-12-12

最新評論

乐业县| 安徽省| 台山市| 长沙县| 宽甸| 肥西县| 南昌市| 黄平县| 澳门| 吴堡县| 杭州市| 即墨市| 古蔺县| 蒙自县| 沙雅县| 通道| 井研县| 务川| 南涧| 丹江口市| 蒙自县| 桐柏县| 从化市| 梁山县| 封丘县| 巢湖市| 通榆县| 凉山| 泗阳县| 灵石县| 金昌市| 马龙县| 万州区| 安陆市| 柞水县| 辽中县| 盐池县| 潞西市| 鸡泽县| 广汉市| 福贡县|