目錄
選型
程式碼
程式守護
效果圖
輸出日誌
首頁 php框架 Laravel 基於Laravel框架下使用守護程式supervisor實現定時任務(毫秒)

基於Laravel框架下使用守護程式supervisor實現定時任務(毫秒)

Aug 16, 2018 am 10:14 AM
laravel php redis supervisor

這篇文章帶給大家的內容是關於基於Laravel框架下使用守護程序supervisor實現定時任務(毫秒),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

公司需要實現X分鐘內每隔Y秒輪訓某個接口,Linux自帶的crontab貌似只精確到分鐘,雖然可以到精確到秒,但是並不滿足需求。

選型

公司專案都是 基於 Laravel 框架,所以這個沒得選。守護程式用的supervisor,看看這個傢伙能不能滿足我們的需求

程式碼

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Cache;
use Carbon\Carbon;

class TaskCommand extends Command {

    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'ue:task
        {--id=      : 当前编号}
        {--max=     : 最大线程}
        {--sleep=   : 休眠多少毫秒}
        {--debug=   : 是否调试模式}
        ';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct() {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle() {
        $this->id       = $this->option('id') ?? '00';
        $this->max      = $this->option('max') ?? 32;
        $this->sleep    = $this->option('sleep') ?? 700;
        $this->debug    = $this->option('debug') ?? false;

        if ($this->id > $this->max) {
            return true;
        }

        while (true) {
            $this->doRun();
        }
    }

    /**
     * 
     * @param int $taskId
     * @return boolean
     */
    protected function doRun() {
        $lock = sprintf('task:%03d:%s', $this->id, time());
        $data = [
            'id' => $this->id,
            'max' => $this->max,
            'time'  => (new Carbon)->format('Y-m-d H:i:s.u'),
            'key' => $lock,
        ];
        try {
            $result = cache()->get($lock);
            if ($result) {
                $data['message'] = 'Task Has been executed.';
                $this->wait($this->sleep);
                return true;
            }
            cache()->put($lock, true, 2);
            $data['message'] = 'Task Executed.';
            $this->logger($data);
            $this->wait($this->sleep);
        } catch (\Exception $ex) {
            $data['message'] = $ex->getMessage();
            cache()->put($data, true, 2);
            $this->wait($this->sleep);
        }
    }

    /**
     * 毫秒
     * @param string $time
     */
    protected function wait($time) {
        $wait = $time * 1000;
        usleep($wait);
    }

    protected function logger($message) {
        if($this->debug){
            $time   = (new Carbon)->format('Y-m-d H:i:s.u');
            $this->line(array_get($message, 'message') .' - '. $time);
        }

        logger()->stack(['task'])->debug(null, $message);
    }

}
登入後複製

程式守護

[program:task-worker]
process_name=%(program_name)s_%(process_num)02d
command=/usr/bin/php /home/wwwroot/demo/artisan ue:task --id=%(process_num)02d --max=8
autostart=true
autorestart=true
user=www
numprocs=8
redirect_stderr=true
stdout_logfile=/home/wwwroot/demo/storage/logs/worker.log
登入後複製
上面是supervisor的配置

效果圖

Task Executed. - 2018-08-14 22:17:18.985094
Task Executed. - 2018-08-14 22:17:19.336115
Task Executed. - 2018-08-14 22:17:20.038236
Task Executed. - 2018-08-14 22:17:21.090470
Task Executed. - 2018-08-14 22:17:22.142716
Task Executed. - 2018-08-14 22:17:23.195126
Task Executed. - 2018-08-14 22:17:24.247698
Task Executed. - 2018-08-14 22:17:25.300066
Task Executed. - 2018-08-14 22:17:26.352638
Task Executed. - 2018-08-14 22:17:27.054124
Task Executed. - 2018-08-14 22:17:28.106420
Task Executed. - 2018-08-14 22:17:29.158906
Task Executed. - 2018-08-14 22:17:30.211438
Task Executed. - 2018-08-14 22:17:31.263542
Task Executed. - 2018-08-14 22:17:32.315923
Task Executed. - 2018-08-14 22:17:33.017096
Task Executed. - 2018-08-14 22:17:34.068963
Task Executed. - 2018-08-14 22:17:35.121267
Task Executed. - 2018-08-14 22:17:36.173600
Task Executed. - 2018-08-14 22:17:37.226165
登入後複製

輸出日誌

[2018-08-14 22:12:24] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:24.389224","key":"task:001:1534255944","message":"Task Executed."} 
[2018-08-14 22:12:25] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:25.390158","key":"task:001:1534255945","message":"Task Executed."} 
[2018-08-14 22:12:26] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:26.391594","key":"task:001:1534255946","message":"Task Executed."} 
[2018-08-14 22:12:27] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:27.393196","key":"task:001:1534255947","message":"Task Executed."} 
[2018-08-14 22:12:28] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:28.395124","key":"task:001:1534255948","message":"Task Executed."} 
[2018-08-14 22:12:29] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:29.396796","key":"task:001:1534255949","message":"Task Executed."} 
[2018-08-14 22:12:30] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:30.398666","key":"task:001:1534255950","message":"Task Executed."} 
[2018-08-14 22:12:31] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:31.400561","key":"task:001:1534255951","message":"Task Executed."} 
[2018-08-14 22:12:32] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:32.402462","key":"task:001:1534255952","message":"Task Executed."} 
[2018-08-14 22:12:33] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:33.404092","key":"task:001:1534255953","message":"Task Executed."} 
[2018-08-14 22:12:34] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:34.405550","key":"task:001:1534255954","message":"Task Executed."} 
[2018-08-14 22:12:35] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:35.407197","key":"task:001:1534255955","message":"Task Executed."} 
[2018-08-14 22:12:36] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:36.408920","key":"task:001:1534255956","message":"Task Executed."} 
[2018-08-14 22:12:37] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:37.410841","key":"task:001:1534255957","message":"Task Executed."} 
[2018-08-14 22:12:38] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:38.412764","key":"task:001:1534255958","message":"Task Executed."} 
[2018-08-14 22:12:39] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:39.414518","key":"task:001:1534255959","message":"Task Executed."} 
[2018-08-14 22:12:40] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:40.416229","key":"task:001:1534255960","message":"Task Executed."} 
[2018-08-14 22:12:41] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:41.418001","key":"task:001:1534255961","message":"Task Executed."} 
[2018-08-14 22:12:42] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:42.419476","key":"task:001:1534255962","message":"Task Executed."} 
[2018-08-14 22:12:43] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:43.421388","key":"task:001:1534255963","message":"Task Executed."} 
[2018-08-14 22:12:44] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:44.423164","key":"task:001:1534255964","message":"Task Executed."} 
[2018-08-14 22:12:45] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:45.424798","key":"task:001:1534255965","message":"Task Executed."} 
[2018-08-14 22:12:46] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:46.426667","key":"task:001:1534255966","message":"Task Executed."} 
[2018-08-14 22:12:47] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:47.428553","key":"task:001:1534255967","message":"Task Executed."} 
[2018-08-14 22:12:48] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:48.430427","key":"task:001:1534255968","message":"Task Executed."} 
[2018-08-14 22:12:49] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:49.432118","key":"task:001:1534255969","message":"Task Executed."} 
[2018-08-14 22:12:50] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:50.433893","key":"task:001:1534255970","message":"Task Executed."} 
[2018-08-14 22:12:51] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:51.435711","key":"task:001:1534255971","message":"Task Executed."} 
[2018-08-14 22:12:52] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:52.437015","key":"task:001:1534255972","message":"Task Executed."} 
[2018-08-14 22:12:53] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:53.438352","key":"task:001:1534255973","message":"Task Executed."} 
[2018-08-14 22:12:54] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:54.439989","key":"task:001:1534255974","message":"Task Executed."} 
[2018-08-14 22:12:55] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:55.441580","key":"task:001:1534255975","message":"Task Executed."} 
[2018-08-14 22:12:56] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:56.443116","key":"task:001:1534255976","message":"Task Executed."} 
[2018-08-14 22:12:57] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:57.445006","key":"task:001:1534255977","message":"Task Executed."}
登入後複製

相關推薦:

用PHP實作守護程式任務後台執行與多執行緒(php- resque使用說明)

php定時計畫任務框架分享

php框架Laravel中實作supervisor執行非同步進程

#

以上是基於Laravel框架下使用守護程式supervisor實現定時任務(毫秒)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1325
25
PHP教程
1272
29
C# 教程
1252
24
如果session_start()被多次調用會發生什麼? 如果session_start()被多次調用會發生什麼? Apr 25, 2025 am 12:06 AM

多次調用session_start()會導致警告信息和可能的數據覆蓋。 1)PHP會發出警告,提示session已啟動。 2)可能導致session數據意外覆蓋。 3)使用session_status()檢查session狀態,避免重複調用。

REDIS:了解其架構和目的 REDIS:了解其架構和目的 Apr 26, 2025 am 12:11 AM

Redis是一种内存数据结构存储系统,主要用作数据库、缓存和消息代理。它的核心特点包括单线程模型、I/O多路复用、持久化机制、复制与集群功能。Redis在实际应用中常用于缓存、会话存储和消息队列,通过选择合适的数据结构、使用管道和事务、以及进行监控和调优,可以显著提升其性能。

哪些數據庫版本與最新的Laravel兼容? 哪些數據庫版本與最新的Laravel兼容? Apr 25, 2025 am 12:25 AM

最新版本的Laravel10與MySQL5.7及以上、PostgreSQL9.6及以上、SQLite3.8.8及以上、SQLServer2017及以上兼容。這些版本選擇是因為它們支持Laravel的ORM功能,如MySQL5.7的JSON數據類型,提升了查詢和存儲效率。

作曲家:通過AI的幫助開發PHP 作曲家:通過AI的幫助開發PHP Apr 29, 2025 am 12:27 AM

AI可以幫助優化Composer的使用,具體方法包括:1.依賴管理優化:AI分析依賴關係,建議最佳版本組合,減少衝突。 2.自動化代碼生成:AI生成符合最佳實踐的composer.json文件。 3.代碼質量提升:AI檢測潛在問題,提供優化建議,提高代碼質量。這些方法通過機器學習和自然語言處理技術實現,幫助開發者提高效率和代碼質量。

php框架laravel和yii區別是什麼 php框架laravel和yii區別是什麼 Apr 30, 2025 pm 02:24 PM

Laravel和Yii的主要區別在於設計理念、功能特性和使用場景。 1.Laravel注重開發的簡潔和愉悅,提供豐富的功能如EloquentORM和Artisan工具,適合快速開發和初學者。 2.Yii強調性能和效率,適用於高負載應用,提供高效的ActiveRecord和緩存系統,但學習曲線較陡。

session_start()函數的意義是什麼? session_start()函數的意義是什麼? May 03, 2025 am 12:18 AM

session_start()iscucialinphpformanagingusersessions.1)ItInitiateSanewsessionifnoneexists,2)resumesanexistingsessions,and3)setsasesessionCookieforContinuityActinuityAccontinuityAcconActInityAcconActInityAcconAccRequests,EnablingApplicationsApplicationsLikeUseAppericationLikeUseAthenticationalticationaltication and PersersonalizedContentent。

H5:HTML5的關鍵改進 H5:HTML5的關鍵改進 Apr 28, 2025 am 12:26 AM

HTML5帶來了五個關鍵改進:1.語義化標籤提升了代碼清晰度和SEO效果;2.多媒體支持簡化了視頻和音頻嵌入;3.表單增強簡化了驗證;4.離線與本地存儲提高了用戶體驗;5.畫布與圖形功能增強了網頁的可視化效果。

REDIS:它如何充當數據存儲和服務 REDIS:它如何充當數據存儲和服務 Apr 24, 2025 am 12:08 AM

REDISACTSASBOTHADATASTOREANDASERVICE.1)ASADATASTORE,ITUSESIN-MEMORYSTOOGATOFORFOFFASTESITION,支持VariousDatharptructuresLikeKey-valuepairsandsortedsetsetsetsetsetsetsets.2)asaservice,ItprovidespunctionslikeItionitionslikepunikeLikePublikePublikePlikePlikePlikeAndluikeAndluAascriptingiationsmpleplepleclexplectiations

See all articles