>  기사  >  PHP 프레임워크  >  Laravel의 큐 메커니즘에 대해 이야기하고 큐의 사용 시나리오를 이해해 보겠습니다.

Laravel의 큐 메커니즘에 대해 이야기하고 큐의 사용 시나리오를 이해해 보겠습니다.

青灯夜游
青灯夜游앞으로
2021-12-20 16:52:492479검색

Laravel 대기열을 어떻게 사용하나요? 아래 Laravel튜토리얼 칼럼에서는 라라벨 큐 사용법과 큐 사용 시나리오를 소개하겠습니다.

Laravel의 큐 메커니즘에 대해 이야기하고 큐의 사용 시나리오를 이해해 보겠습니다.

왜?

우선 왜 큐를 사용해야 하는지, 큐를 사용하지 않으면 어떻게 되는지 알아야 합니다! 장점과 단점은 무엇입니까

간단한 시나리오의 몇 가지 예를 들 수 있습니다.

이메일 보내기

이메일을 보낼 때 일반적으로 직면하는 문제는 무엇입니까 ??

  • 느린 보내기
  • 보내지 못했습니다
  • 보내는 빈도가 너무 높거나 서비스 제공업체에서 거부했거나 휴지통

큐를 사용하면 어떤 이점이 있나요

  • 클라이언트 응답 향상

    전송 시 바로 처리하지 않고 서버에 던져서 큐를 관리하고 예약합니다. 구성에 따라 즉시 전송하거나 전송을 지연하도록 옵션을 사용자 정의할 수 있습니다

  • 내결함성 향상

    전송 프로세스 중에 대상이 거부되는 경우가 있습니다. 예를 들어, 대부분의 사람들은 오류 502를 admin@qq.comn로 보내는 시나리오를 접하게 됩니다. 그러면 이 시나리오는 이메일을 보내는 과정에서 다음 이벤트를 트리거하고 구축할 수 있습니다. 이메일이 성공적으로 전송되면 콜백

      전송 실패 시 재시도
    • 이 이메일을 통해 전송하면 시간이 많이 걸리는 여러 작업이 발생할 수 있으므로 실제로 여러
    • 대기열 서비스
    • 를 구축할 수 있습니다. 각 대기열은 자체적인 항목을 관리하며 매우
    • 분리되어 있습니다
    • Laravel 대기열을 통해 매우 잘 설정할 수 있습니다
    • 즉시 보내기
    ,

    지연 보내기, 전송 재시도

    전송 빈도를 제어할 수 있습니다 개발자 일괄 전송된 이메일을 사용하는 사람은 필연적으로 문제에 직면하게 됩니다. 즉, 일괄적으로 직접 전송하면, 즉 동시에 많은 수의 이메일을 전송하게 됩니다. 그러면 이메일 서비스 제공업체가 우리의 이메일을 거부하거나 이메일은 휴지통에 들어가 광고

    로 식별될 가능성이 높습니다. 따라서 여기에
  • 지연된 전송
  • 이 있습니다. 우리는 알려진 정보를 기반으로 이를 사용할 수 있습니다. 현재 대기열 서비스 배달을 기다리는 이메일의 경우 빈도를 합리적으로 구성하거나 이메일 구성을 전환하여 제어 가능한 빈도를 얻을 수 있습니다.

    예를 들어 1분에 10번 전송되도록 구성을 설정하는 등 마찬가지로 여기에서

    구성, 주파수 제어 및 전송 제어 분리를 달성할 수 있습니다

    Others

    물론 다양한 상황에서 사용할 것입니다

서버 측에서 Excel을 다운로드하세요서버 측 빅 데이터의 비동기 멀티태스킹오류 메시지 처리

  • Laravel 대기열 사용 방법
  • 다음은 일반적인 사용 지침 목록과 더 나은 사용 방법입니다. 코드가 제대로 실행되지 않을 수 있습니다. 가장 중요한 것은 논리를 이해하는 것입니다. 여기서는 Redis를 드라이버로 사용하고 있습니다

드라이버는 Redis

> .env
QUEUE_CONNECTION=redis
> 在 config/queue.php 中可以找到

로 설정되어 있습니다. 대기열 및 전달 작업을 빠르게 생성하세요

# 创建 任务
php artisan make:job ProcessPodcast
자동 생성

class EmailJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $data;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct(array $data)
    {
        $this->data = $data;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $service = new EmailService();

        // ... 检查当前可用 Mailer
        // 这里你自定义就好了,这个方法中你可以根据你自己的配置,获取到当前可用的配置
        $mailer = $service->getMailer();

        // ... 获取当前要发送的数据
        $data = $this->data;
        
        $service->send($mailer, $data);
    }
}

몇 가지 일반적인 작업

이 작업은 문서에서 찾을 수 있습니다

app/Jobs/EmailJob.php

Call Send

# 延迟 2分钟 发送
# 这里使用的是 Crontab 包 (不过 Laravel 自带)
EmailJob::dispatch()->delay(now()->addMinutes(2));

# 立即发送 (不会进入到队列中)
EmailJob::dispatchNow();
여기의 대기열은 기본적으로 기본 대기열을 사용하며 대기열 서비스를 지정하도록 수정할 수 있습니다
public function __construct(array $data)
{
    # 使用 emailQueue
    $this->onQueue('emailQueue');
    $this->data = $data;
}

실패 시 재시도 횟수 설정
# 重试 5 次
public $tries = 5;

시간 초과 기간 설정

/**
* 确定任务应该超时的时间
*
* @return \DateTime
*/
public function retryUntil()
{
    return now()->addMinutes(10);
}
큐 시작

onQueue를 구성하지 않은 경우 ---queue 매개변수 없이 구성할 수 있습니다

php artisan queue:work --queue=emailQueue

이벤트와 결합하여 분리

Laravel 이벤트는 다음과 같습니다. 또한 queues를 통해서도 구현되었습니다

# 创建 Event
php artisan make:event FailEvent

class FailEvent
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    protected $data;
    protected $tag;

    /**
     * @param array $data 投递的数据
     * @param string $tag 要操作的事情
     */
    public function __construct(array $data, string $tag = 'system')
    {
        $this->data = $data;
        $this->tag = $tag;
    }
}

# 创建 listener 
php artisan make:listener FailListener
class FailListener
{
    /**
    * Handle the event.
    * 
    * @param  object  $event
    * @return void
    */
    public function handle(FailEvent $event)
    {
        $this->{$event->tag}($event->data);
    }

    /**
     * 处理系统异常
     * DateTime: 2021/12/3 11:02 上午
     * @param array $data
     */
    public function system(array $data)
    {

    }

    /**
    * 处理邮件异常
    * DateTime: 2021/12/3 11:02 上午
    */
    public function email()
    {
    
    }

}

# app/Providers/EventServiceProvider.php
protected $listen = [
    FailEvent::class => [
        FailListener::class,
    ],
]

# 投递
event(new FailEvent(['error' = '异常信息'], 'email'));

Others

사실 전체 프로세스를 구현하는 데는 Laravel이 대부분 도움을 주었습니다. Redis를 사용하여 제어 가능한 대기열을 직접 구현할 수 있습니다. Redis 관련 데이터 유형을 마스터하려면 숙련도만 있으면 됩니다. 다음은 Redis의 위 모드에서 사용되는 데이터 유형의 간략한 목록입니다

List

이를 사용하면 팝핑 및 푸시 큐 기능을 완성할 수 있습니다.

Hash
  • 이를 사용하면 시퀀스를 저장하는 데 사용할 수 있습니다.

    Event

    또는

    Job

  • __construct
  • 이 전달되면

    메일러 데이터도 저장할 수 있습니다.

    Sorted Set은 시간을 Sorted로 설정할 수 있습니다. Set

    은 최근에 실행하려는 대기열 작업을 찾기 위해 점수별로 정렬됩니다

  • 물론 Redis에는 자신의 요구 사항을 충족하기 위한 다른 용도가 많이 있습니다.

    세상에 완벽한 해결책은 없습니다. 자신에게 가장 적합한 솔루션만 있을 뿐입니다. 직장에서 문제가 발생하면 하나의 예에서 추론하는 방법을 배우고, 다양한 도구를 합리적으로 사용하고, 이를 달성하기 위한 솔루션을 설계하십시오. 코드는 단지 최종적인 축소판일 뿐입니다. 마지막은 이해하는 법을 배우는 것입니다. 각 언어와 각 프레임워크는 단지 솔루션의 구현일 뿐입니다. 이를 마스터해야만 무적이 될 수 있습니다...

    더 많은 프로그래밍 관련 지식을 보려면 , 다음 페이지를 방문하세요: 프로그래밍 소개 ! !

위 내용은 Laravel의 큐 메커니즘에 대해 이야기하고 큐의 사용 시나리오를 이해해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제