> PHP 프레임워크 > Laravel > 데몬 감독자를 사용하여 Laravel 프레임워크를 기반으로 예약된 작업(밀리초) 구현

데몬 감독자를 사용하여 Laravel 프레임워크를 기반으로 예약된 작업(밀리초) 구현

不言
풀어 주다: 2018-08-16 10:14:11
원래의
4859명이 탐색했습니다.

이 기사의 내용은 Laravel 프레임워크를 기반으로 예정된 작업(밀리초)을 구현하기 위해 데몬 슈퍼바이저를 사용하는 것에 대한 내용입니다. 필요한 친구들이 참고할 수 있기를 바랍니다.

회사에서는 X분 내에 Y초마다 인터페이스 순환 교육을 구현해야 합니다. Linux와 함께 제공되는 crontab은 정확할 수 있지만 몇 분 정도밖에 안되는 것 같습니다. 초 단위로 정확해야 하며 수요를 충족하지 못합니다. Linux自带的crontab貌似只精确到分钟,虽然可以到精确到秒,但是并不满足需求。

选型

公司项目都是 基于 Laravel 框架,所以这个没得选。守护进程用的 supervisor

Selection

회사의 프로젝트는 모두 Laravel 프레임워크를 기반으로 하므로 선택의 여지가 없습니다. 데몬 프로세스는 supervisor를 사용하는데, 이 사람이 우리의 요구를 충족시킬 수 있는지 봅시다

code
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);
    }

}
로그인 후 복사
process Guardian

[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

rendering

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
로그인 후 복사
output log

의 구성입니다.

[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 프레임워크를 기반으로 예약된 작업(밀리초) 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿