PHP의 Laravel 프레임워크에서 메시지 큐와 비동기 큐를 사용하는 방법에 대한 분석

不言
풀어 주다: 2023-03-31 21:40:02
원래의
2912명이 탐색했습니다.

이 글에서는 주로 PHP의 Laravel 프레임워크에서 메시지 큐 큐와 비동기 큐를 사용하는 방법을 소개합니다. Laravel 5.0 이후 버전의 경우 예제 환경은 Linux 시스템입니다. 필요한 친구는

큐 구성

을 참조하세요. 이전 프로젝트에서 큐를 어떻게 사용했는지 설명하겠습니다.

현재 프로젝트는 모두 Symfony를 사용하고, 이전 프로젝트는 Symfony1.4를 사용하며, 최신 프로젝트는 Symfony2를 사용합니다. Symfony를 사용하는 전반적인 느낌은 매우 즐겁습니다. 특히 일반적으로 Java 프레임워크의 디자인 아이디어를 많이 사용하는 Symfony2입니다. 하지만 대기열을 지원하지 않습니다. 심포니에서도 큐를 사용하여 여러 프로세스를 거쳤습니다. 처음에는 Zhang Yan의 httpsqs를 사용했습니다. 이것은 사용하기 간단하지만 단일 지점이 있습니다. 결국 우리 프로젝트는 여전히 공식적으로 외부 세계에 서비스를 제공하고 있기 때문에 Apache의 오픈 소스 프로젝트인 ActiveMQ를 연구한 결과 Apache의 최신 MQ인 Apollo가 있음을 발견했습니다. 결국 우리는 Apollo를 사용하기로 결정했습니다.

우리 프로젝트에서 대기열의 주요 적용 시나리오는 타사 데이터 동기화, 타사 데이터 사용자에게 데이터 변경 사항을 동기식으로 알리는 등 시간이 많이 걸리는 일부 기능을 비동기식으로 처리하는 것입니다. 우리의 일반적인 아이디어는 각 컨트롤러에 비동기 처리가 필요한 경우 json 개체를 인코딩하여 Apollo에 저장하는 것입니다. 다른 작업 명령을 작성하고, 이 명령에서 json 개체를 구문 분석하고, 내부 작업 및 매개변수를 기반으로 다양한 메서드를 호출합니다. 비즈니스 요구에 따라 동시에 여러 컴퓨터에서 Command를 데몬 프로세스로 실행하는 것도 비동기 멀티태스킹 애플리케이션을 구현하는 솔루션으로 간주될 수 있습니다. 나는 laravel을 발견할 때까지 계속 사용했습니다. 연구해 볼 계획입니다. 가능하다면 교체가 불가능한 것은 아닙니다. 헤헤.

저는 이제 막 배우기 시작했으니 당연히 laravel5로 바로 갔습니다. Route, Controller, View는 기본적으로 Symfony와 동일하므로 시작하는 것이 어렵지 않습니다. 마지막으로 대기열을 연구합니다.

1. laravle을 설치하고 작곡가를 사용하면 매우 간단합니다.

composer global require "laravel/installer=~1.1"
vi ~/.bash_profile
로그인 후 복사

환경 변수에 ~/.composer/vendor/bin을 추가하세요.

source ~/.bash_profile
로그인 후 복사

명령줄에서 직접 laravel을 사용할 수 있습니다. 한번 시도해 보세요.

laravel -V
로그인 후 복사

다음 내용이 보이면 성공을 의미합니다.

Laravel Installer version 1.2.1
로그인 후 복사

2. 프로젝트를 생성합니다.

laravel new guagua
로그인 후 복사

3. Redis 및 대기열을 구성합니다.

4. 컨트롤러를 생성하고

php artisan make:controller DefaultController
로그인 후 복사

컨트롤러 동작으로 100개의 대기열 작업을 푸시합니다.

for($i = 0; $i < 100; $i ++) {
  Queue::push(new SendEmail("ssss".$i));
}
로그인 후 복사

5. 대기열 생성 명령

php artisan make:command SendEmail --queued
로그인 후 복사
로그인 후 복사

app/Commands/SendEmail.php를 수정하고 개인 변수를 추가하세요.

protected $msg;
로그인 후 복사

생성자도 수정하세요.

public function __construct($msg)
{
  $this->msg = $msg;
}
로그인 후 복사

수정된 핸들 방법

public function handle() {
  sleep(4);
  echo $this->msg."\t".date("Y-m-d H:i:s")."\n";
  $this->delete();
}
로그인 후 복사

6. 경로 수정

Route::get(&#39;/&#39;, [
  &#39;as&#39; => &#39;index&#39;,
  &#39;uses&#39; => &#39;DefaultController@index&#39;
]);
로그인 후 복사

7.

php artisan queue:listen
로그인 후 복사
로그인 후 복사

멀티태스킹을 확인하기 위해 3개를 엽니다. 동시에 창을 열고 동일한 명령을 실행합니다.

8. laravel에 내장된 서버를 사용하여 서비스를 시작하세요.

php artisan serve --port 8080
로그인 후 복사

브라우저를 열고 http://localhost:8080/ 페이지를 방문하세요. 물론 nginx, apache 등을 사용할 수도 있습니다. 하지만 다양한 구성이 필요하며, 내장된 구성은 사용하기 쉽습니다.

아래와 같이 콘솔에서 각 큐의 실행 상태를 확인할 수 있습니다. 100개의 작업이 3개의 작업에 균등하게 나누어져 있는 것을 볼 수 있습니다.


이 시점에서 기본적으로 원하는 효과를 얻었습니다. laravel은 쉽게 큐를 구현하고 멀티 태스킹을 처리할 수 있음을 검증했습니다. 2016321142239283.png (862×658)

use AppCommandsCommand는 make 명령으로 생성된 코드에 사용되는데 실행하면 해당 파일이 없다는 메시지가 나타납니다. 해결책은 IlluminateConsoleCommand를 사용하도록 변경하는 것입니다. 이러한 낮은 수준의 문제가 왜 발생하는지 모르겠습니다. 내 Mac 시스템에 문제가 있는 건가요, 아니면 내 캐릭터에 문제가 있는 건가요?

컨트롤러 작업에서 대기열을 푸시할 때 비동기 실행이 없으며 작업 스크립트에서 계속 실행됩니다. 구성 문제인 것으로 확인되었습니다. config의 queue.php뿐만 아니라 .evn의 관련 구성도 수정해야 하는 것으로 나타났습니다. 문제가 해결되었음에도 불구하고 여전히 볼에 통증이 느껴지고 이해할 수 없습니다. 아직 라라벨을 배워야 합니다.


비동기 큐 사용법


1. 구성

여기에서는 큐의 정의를 소개하지 않습니다. 비동기 대기열을 사용하는 데는 두 가지 핵심이 있습니다:

(1)存储队列的地方
(2)执行任务的服务
打开 config/queue.php ,这是Laravel5关于队列的配置文件。首先我们可以通过 default 参数指定默认队列驱动,默认配置是 sync , 这是同步队列,我们要做异步队列首先就要改变这里。假设我们用 database 作为驱动,队列任务将会存放在数据库中,而我们后面会另外启动一个后台服务来处理队列任务,这就是异步方式了。

&#39;default&#39; => &#39;database&#39;
로그인 후 복사

修改完配置后,我们需要创建一个表来存放队列任务,Laravel5已经在自带artisan命令中内置了一个指令用来生成数据迁移,只需要两条命令即可,当然你得实现配置好数据库连接。

php artisan queue:table
php artisan migrate
로그인 후 복사

这样就自动在数据库中创建了 jobs 表。

2.启动队列监听服务

通过下面这条指令启动队列监听服务,它会自动处理 jobs 表中的队列任务:

php artisan queue:listen
로그인 후 복사
로그인 후 복사

在linux中,如果想让它在后台执行,可以这样:

nohup php artisan queue:listen &
로그인 후 복사

3.添加队列任务

关于队列任务的添加,手册里说的比较详细,这里就简单举个例子吧。

首先,通过artisan创建一个队列命令:

php artisan make:command SendEmail --queued
로그인 후 복사
로그인 후 복사

这样会生成 app/Commands/SendEmail.php 这个类文件,这个类会被标识为队列命令,你可以在 handle 方法中写自己的业务逻辑。

在控制器中,可以简单通过 Bus::dispatch 分发任务:

Bus::dispatch(new \App\Commands\SendEmail());
로그인 후 복사

你会发现任务不会立即执行,而是被放到 jobs 表中,由队列监听服务处理。

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

如何解决Laravel中log无法写入的问题

关于PHP的autoLoad自动加载机制的分析

위 내용은 PHP의 Laravel 프레임워크에서 메시지 큐와 비동기 큐를 사용하는 방법에 대한 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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