Docker+Laravel의 작업 스케줄러
목표
일반 서버 작업 스케줄러는cron을 통해 진행
전제 조건
다음 환경에 설치합니다.
샘플 규격
서버의 작업 스케줄로 인해 화면 조작을 위해 로그인해야 합니다.
작업 자체가 이미 별도로 설치되었다고 가정하면, 작업 이름과 일정을 실행하는 화면을 설정하십시오
준비
퀘스트의 실행은 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 연결과 로그 출력 등을 고려할 필요가 없습니다.
문제는
Docker 이미지도 크론을 시작할 수 있지만 이번에는 사랑을 끊었다
이것은 실시의 문제다...
Reference
이 문제에 관하여(Docker+Laravel의 작업 스케줄러), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kingconyd/items/4373eb73b679c619d39d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)