Docker+Laravel의 작업 스케줄러

6589 단어 DockerLaravelPHP

목표


일반 서버 작업 스케줄러는cron을 통해 진행
  • 좀 귀찮아요
  • Laravel의 작업 스케줄러 기능
  • 따라서 생성 화면을 만들어 화면을 통해 미션 일정을 설정할 수 있는 화면을 만들어 보자.

    전제 조건


    다음 환경에 설치합니다.
  • PHP7.1.x
  • Laravel6.x+AdminLTE3
  • PostgreSQL11.4
  • Docker phpfpm
  • 샘플 규격


    서버의 작업 스케줄로 인해 화면 조작을 위해 로그인해야 합니다.
    작업 자체가 이미 별도로 설치되었다고 가정하면, 작업 이름과 일정을 실행하는 화면을 설정하십시오
    준비
    퀘스트의 실행은 Laravel에서cron을 통해 퀘스트 스케줄러를 실행하고 이전 화면에 퀘스트 스케줄러의 설정을 반영합니다.

    작업 구현


    자세한 내용은 생략되었지만,artisan으로 작업의 모형을 만들 수 있습니다.
    % php artisan make:command タスク名
    
    한 마디로 하면 임무의 이동 여부를 확인하기 위해 다음과 같은 임무를 실시했다.
    <?php
    
    namespace App\Console\Commands;
    
    use Illuminate\Console\Command;
    use Illuminate\Support\Facades\Log;
    
    class Shout extends Command
    {
        /**
         * The name and signature of the console command.
         *
         * @var string
         */
        protected $signature = 'command:shout';
    
    〜省略〜
    
        /**
         * Execute the console command.
         *
         * @return mixed
         */
        public function handle()
        {
            Log::info("start shout!!");
        }
    }
    
    보시다시피 로그만 출력하는 작업입니다.

    모델 정의


    정의할 모델은 ScrapingCommand입니다.
    migrate의 내용은 다음과 같다.
     ?php
    
    use Illuminate\Database\Migrations\Migration;
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Support\Facades\Schema;
    
    class CreateScrapingCommandsTable extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::create('scraping_commands', function (Blueprint $table) {
                $table->bigIncrements('id');
                $table->string("name",200);
                $table->string("cmd",200);
                $table->integer("cron1")->nullable();
                $table->integer("cron2")->nullable();
                $table->integer("cron3")->nullable();
                $table->integer("cron4")->nullable();
                $table->integer("cron5")->nullable();
                $table->integer("flg")->default(0);
                $table->softDeletes();
                $table->timestamps();
            });
        }
    
        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down()
        {
            Schema::dropIfExists('scraping_commands');
        }
    }
    

    화면 설치


    로그인 화면


    AdminLTE를 직접 사용한 제품입니다.

    작업 요약 화면


    등록된 작업이 나열됩니다.
    작업 진도표의 형식은cron과 같습니다.시간표 외에 유효/무효 설정도 할 수 있습니다.

    작업 설정 화면


    작업을 수행하는 설정입니다.명령 이름을artisan에서 사용하는 명령 이름으로 설정합니다 ("\$signature"로 설정).
    설정 컨텐트는 ScrapingCommand 모델에 저장됩니다.

    Laravel 측면 계획 정의


    Laravel의 작업 스케줄링은 App\Console\Kernel의 schedule 방법에 정의되어 있기 때문에
    아래와 같이 이 방법을 수정하였다.
    <?php
    
    namespace App\Console;
    
    use Illuminate\Console\Scheduling\Schedule;
    use Illuminate\Support\Facades\Log;
    use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
    use App\ScrapingCommand;
    
    class Kernel extends ConsoleKernel
    {
    〜省略〜
        /**
         * Define the application's command schedule.
         *
         * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
         * @return void
         */
        protected function schedule(Schedule $schedule)
        {
            $lst = ScrapingCommand::where("flg",1)->get();
            foreach($lst as $rec) {
                Log::info("cmd:".$rec->cmd);
                Log::info("cron:".$rec->cronStr());
                $schedule->command($rec->cmd)->cron($rec->cronStr());
            }
        }
    〜省略〜
    }
    

    Cron 측면 설정


    Cron은 Laravel의 작업 스케줄러만 수행합니다.
    * * * * * /usr/local/bin/php /svr/app/artisan schedule:run >> /var/log/cron.log 2>&1
    
    (注)/svr/appはLaravelをインストールしたディレクトリ  
    
    원래는 crontab-e로 위와 같은 파일을 만들었지만, 이번에는 Docker
    루트 파일로 생성됩니다.
    위에서 설명한 바와 같이 요구 사항이 설치되었지만 이번에는 Docker로 설치되었기 때문에 용기에cron을 설치해야 합니다.
    따라서 cron 설치는 Docker 이미지 제작 시 수행됩니다.따라서 Docker 파일
    FROM php:fpm
    
    # For composer
    RUN apt-get update \
        && apt-get install -y gcc make zlib1g-dev libzip-dev libpng-dev unzip libmcrypt-dev libjpeg-dev libfreetype6-dev \
        && docker-php-ext-install zip \
        && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include \
        && docker-php-ext-install -j$(nproc) gd
    
    # Install composer
    RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
      && php composer-setup.php \
      && php -r "unlink('composer-setup.php');" \
      && mv composer.phar /usr/local/bin/composer
    
    # Set composer environment
    ENV COMPOSER_ALLOW_SUPERUSER 1
    ENV COMPOSER_HOME /composer
    ENV PATH $PATH:/composer/vendor/bin
    
    # Install laravel installer
    RUN composer global require "laravel/installer"
    
    # PHP's DB setting
    RUN apt-get update \
        && apt-get install -y libpq-dev \
        && docker-php-ext-install pdo_mysql pdo_pgsql
    
    # Install Node.js
    RUN curl -sL https://deb.nodesource.com/setup_6.x | bash - \
        && apt-get update \
        && apt-get install -y nodejs
    
    RUN cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
    RUN apt-get install -y cron
    
    RUN mkdir /debugbar
    RUN chmod go+w /debugbar
    WORKDIR /svr
    
    에서 설명한 대로 해당 매개변수의 값을 수정합니다.
    다음은 크론탭을 등록하고 크론을 시작해야 합니다. 이번에는 수동으로 진행됩니다.
    따라서 상술한 그림에서 용기를 시작하여 용기에
    % cp root /var/spool/cron/crontab
    % service cron start
    
    집행
    루트 파일을/svr에 복사해야 합니다.

    고찰


    cron의 설정은 상당히 번거롭다.가장 중요한 것은 반드시 특별히 서버에 로그인하여 작업을 해야 한다.
    만약 이 구조라면 화면에만 설정되어 있기 때문에 매우 쉽다.작업 수준 이동
    DB 연결과 로그 출력 등을 고려할 필요가 없습니다.
    문제는
  • 용기가 시작된 후crontab의 설정과cron의 시작을 수동으로 해야 합니다.
    Docker 이미지도 크론을 시작할 수 있지만 이번에는 사랑을 끊었다
  • 5분마다 기다리는 일정에 대응할 수 없다
    이것은 실시의 문제다...
  • 샘플 설치 항목이 업로드되었습니다GitHub. 필요하면 참고하십시오.

    좋은 웹페이지 즐겨찾기