Laravel5.7에서 비동기 처리

8727 단어 PHPlaravel5.7Horizon
이 글은 니프티 그룹 Advent Calendar 2018 11일째 되는 글이다.
이후 라벨(5.7)으로 비동기 처리를 시도하고 호리존으로 가동을 시도한다.
(Laavel이 이미 활동하는 환경이 있다고 가정합니다.Laradoc 등으로 제작하십시오.)

카탈로그


Laavel(5.7)에서 비동기 처리
  • 비동기식 프로세스 구현
  • 컨트롤러에서 호출
  • 동기화 시도
  • Redis 대기열을 사용하여 시험 가동
  • Laavel Horizon으로 시운전
  • 마지막
  • 1. Laavel(5.7)에서 비동기 처리


    라벨에는 빈스토크, 아마존 SQS, 레디스 등을 단서로 한 비동기적 처리를 간단하게 수행할 수 있는 큐어 서비스가 있다.
    자세한 내용은 공식 문서를 보십시오.

    1.1 비동기적으로 처리하기


    다음 명령을 실행하면 app/Jobs의 부하에서 클래스ProcessSample가 생성됩니다.이 클래스에서 비동기 처리 (작업) 를 실행합니다.
    php artisan make:job ProcessSample
    
    생성된 클래스 handle 방법은 실제 작업을 수행할 때 호출되는 함수입니다.
    나는 적당한 텍스트를 받아 보았고, 실행할 때 로그를 출력하는 작업을 만들어 보았다.
    app/Jobs/ProcessSample.php
    <?php
    
    namespace App\Jobs;
    
    use Illuminate\Bus\Queueable;
    use Illuminate\Queue\SerializesModels;
    use Illuminate\Queue\InteractsWithQueue;
    use Illuminate\Contracts\Queue\ShouldQueue;
    use Illuminate\Foundation\Bus\Dispatchable;
    
    class ProcessSample implements ShouldQueue
    {
        use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    
        private $text;
    
        /**
         * Create a new job instance.
         *
         * @return void
         */
        public function __construct($text)
        {
            $this->text = $text;
        }
    
        /**
         * Execute the job.
         *
         * @return void
         */
        public function handle()
        {
            logger()->info("It's work! | ".$this->text);
        }
    }
    

    1.2 디렉터에서 호출

    dispatch 함수는 작업을 대기열에 추가합니다.
    파라미터는 ProcessSample의 구조기에 맡긴다.
    routes/web.php
    use App\Jobs\ProcessSample;
    
    Route::get('/test/{text}', function ($text) {
        ProcessSample::dispatch($text);
        return 'Queued!';
    });
    

    1.3 동기화 시도

    .env 파일을 설정한 QUEUE_CONNECTION는 실제로 어떤 대기열을 사용합니까?
    아마존 SQS와 레디스 등을 지정할 수 있다.
    여기서 작동 여부를 확인하고 싶어서 동시 실행sync으로 설정했습니다.
    .env
    QUEUE_CONNECTION=sync
    
    방금 /test/{text}라는 URL을 설정했으니 방문해 보세요/test/sampletext.
    storage/logs/laravel-2018-12-11.log
    [2018-12-11 **:**:**] local.INFO: It's work! | sampletext
    
    이런 로그를 출력하면 성공입니다.🎉

    2. Redis 대기열을 사용하여 실행 시도


    레코드를 준비하다


    각자 Redis 호스트를 준비하십시오.
    Laradoc의 경우 Redis가 포함되어 있으므로 아래에서 시작할 수 있습니다.
    docker-compose up -d redis
    

    매크로 패키지 추가 및 구성


    Laavel에서 Redis를 큐로 사용하려면 Predis가 필요하므로 프로젝트에 추가합니다.
    composer require predis/predis
    
    Redis를 대기열로 설정합니다.
    .env
    QUEUE_CONNECTION=redis
    
    # 以下は環境に合わせて設定してください
    REDIS_HOST=redis
    REDIS_PASSWORD=null
    REDIS_PORT=6379
    
    지금까지 Redis 설정이었습니다!

    시험해 보다


    다음 단계에서는 대기열을 실제로 감시할 수 있습니다.
    php artisan queue:work
    
    이 상태에서 액세스/test/sampletext2.
    storage/logs/laravel-2018-12-11.log
    [2018-12-11 **:**:**] local.INFO: It's work! | sampletext2
    
    이런 로그를 출력하면 성공입니다.🎉
    비동기 처리의 실현, 완벽✨

    3. Laavel Horizon으로 이동


    Horizon은 Laavel의 Redis 대기열을 모니터링하는 도구입니다.
    비동기 처리를 하는 부분은 위 절차에 따라 문제가 없고, 호리존에는 대시보드가 있어 처리된 처리량과 실패 등을 확인할 수 있어 즐거워 사용해 봤다.
    자세한 내용은 공식 문서를 보십시오.

    매크로 패키지 추가


    프로젝트에 Horizon을 추가합니다.
    composer require laravel/horizon
    
    Horizon에는 pcntl이 필요합니다.그렇지 않으면 다음 오류가 발생합니다.
    $ composer require laravel/horizon
    Using version ^2.0 for laravel/horizon
    ./composer.json has been updated
    Loading composer repositories with package information
    Updating dependencies (including require-dev)
    Your requirements could not be resolved to an installable set of packages.
    
      Problem 1
        - laravel/horizon v2.0.0 requires ext-pcntl * -> the requested PHP extension pcntl is missing from your system.
        - laravel/horizon 2.0.x-dev requires ext-pcntl * -> the requested PHP extension pcntl is missing from your system.
        - Installation request for laravel/horizon ^2.0 -> satisfiable by laravel/horizon[2.0.x-dev, v2.0.0].
    
    
    Installation failed, reverting ./composer.json to its original content.
    
    Docker를 사용하는 사람은 Docker 파일에 다음 내용을 추가한 다음 구축을 시작할 수 있습니다.
    어떻게든 pcntl를 설치해 주세요.
    Dockerfile
    (略)
    
    RUN docker-php-ext-install pcntl
    
    docker-compose up -d --build
    

    설정


    Horizon을 설치합니다.
    php artisan horizon:install
    
    실패한 대기열의 테이블을 만듭니다.
    php artisan queue:failed-table
    
    php artisan migrate
    
    Horizon의 준비는 여기까지!

    시험해 보다


    Horizon을 시작합니다.
    php artisan horizon
    
    방문/horizon하면 계기판이 나타날 것입니다.
    이 상태에서 액세스/test/sampletext3.
    storage/logs/laravel-2018-12-11.log
    [2018-12-11 **:**:**] local.INFO: It's work! | sampletext3
    
    로그 출력이 성공하면
    수고하셨습니다.👏
    그리고 좀 더 맞춤형으로 만들어서 exit(1) 이상하게 끝날 때까지 놀 수 있어요.
    실패한 작업 일람표에서 실패한 작업을 다시 이동할 수도 있습니다.

    4. 마지막


    비동기 처리는 라벨이 우리를 매우 배려했기 때문에 우리는 간단하게 실현할 수 있다는 것을 알게 되었다.
    이후 슈퍼바이저 등으로 어떻게든 잘 움직여야 한다.
    그냥 움직여 보려고 Horizon에 대해서도 소개했어요.
    Horizon에는 또 다른 인증, 대기 상태가 길었을 때의 알림 등 기능이 있으니 반드시 확인해 주십시오공식 문서.

    좋은 웹페이지 즐겨찾기