laravel異步監控定時調度器實例詳解

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

定時調度器是什么

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

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

場景

我們有一個導入數據的定時任務

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

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

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

出現問題

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

解決

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

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

解決方案

說明:

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

代碼實現

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

github地址:github.com/zzh78727258

composer地址:packagist.org/packages/ze

總結

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

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

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

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

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

相關文章

  • php共享內存段示例分享

    php共享內存段示例分享

    在asp.net和java中都有共享內存,php除了可以使用Memcached等方式變通以外其實php也是支持共享內存的,下面使用shmop來實現這個功能
    2014-01-01
  • thinkPHP5使用Rabc實現權限管理

    thinkPHP5使用Rabc實現權限管理

    這篇文章主要介紹了thinkPHP5使用Rabc實現權限管理功能,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • laravel-admin的多級聯動方法

    laravel-admin的多級聯動方法

    今天小編就為大家分享一篇laravel-admin的多級聯動方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • 使用PHP免費發送定時短信的實例

    使用PHP免費發送定時短信的實例

    本篇文章介紹了使用PHP免費發送定時短信的實例,可以定時的發送短信到手機上,有需要的朋友可以了解一下。
    2016-10-10
  • CI框架安全過濾函數示例

    CI框架安全過濾函數示例

    這篇文章主要介紹了CI框架安全過濾函數,結合實例形式分析了CodeIgniter框架去空、防止XSS的函數定義與使用方法,并附帶了原生PHP進行各種常見安全過濾相關操作技巧,需要的朋友可以參考下
    2018-06-06
  • 利用php_imagick實現復古效果的方法

    利用php_imagick實現復古效果的方法

    相信對于php_imagick很多人都不陌生,這篇文章先進行簡單的介紹了php_imagick和簡單的示例,而后通過示例代碼介紹了利用php_imagick實現復古效果的方法,對大家的學習和工作具有一定的參考借鑒價值,有需要的朋友們下面來一起看看吧。
    2016-10-10
  • PHP生成Gif圖片驗證碼

    PHP生成Gif圖片驗證碼

    驗證碼在好多地方都要用到,這里提供一個新開發的安全驗證碼類,支持生成Gif圖片驗證碼(帶噪點,干擾線,網格,隨機色背景,隨機自定義字體,傾斜,Gif動畫)。從中還可以學到如何用PHP生成Gif圖片的方法。
    2013-10-10
  • PHP生成靜態頁

    PHP生成靜態頁

    PHP生成靜態頁...
    2006-11-11
  • php ajax confirm 刪除實例詳解

    php ajax confirm 刪除實例詳解

    這篇文章主要介紹了php ajax confirm 刪除,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • PHP批量去除BOM頭代碼分享

    PHP批量去除BOM頭代碼分享

    這篇文章主要介紹了PHP批量去除BOM頭代碼分享,本文直接給出實現代碼,代碼比較簡單,容易看懂,需要的朋友可以參考下
    2015-06-06

最新評論

湖北11选5走势图爱彩乐