라라 벨 브로드캐스팅에 대해 알아보겠습니다.
라라 벨 브로드캐스팅이란, 서버에 데이터가 변경되면 메시지가 웹 소캣 연결로 보내져 클라이언트에 의해 처리될 수 있도록 합니다.
바로 테스트를 해보도록 하겠습니다.
테스트는 모든 클라이언트에 대해 메시지를 송신하는 쪽으로 만들었습니다.
만들어 보는것
위와 같은 작업을 수행합니다.
- 1) laravel서버 쪽에서 이벤트를 발생시켜, 레이디스 서버에 6379 포트를 이용하여 데이터를 전달합니다.
-
2) laravel-echo-server와 redis의 SUB/PUB는 항상 연결되어있는 상태로 만들어줍니다.
- 혹시 redis의 SUB/PUB를 모르시는 분은 먼저 개념을 잡아오시는 게 좋을 듯합니다.
- 3) 클라이언트와 laravel-echo-server는 websocket를 이용하여 항상 연결되어있는 상태로 만들어줍니다.
- 1번에서 데이터를 넘겨주었을 때를 라라 벨에코서버는 SUB를 이용하여 데이터를 받아옵니다. 그후 받은 데이터를 클라이언트화면에 뿌려줍니다.
사전작업
redis서버
nodeJs
laravel프레임워크
라이브러리 설치
npm install --save laravel-echo socket.io-client
composer require predis/predis
laravel-echo-server설치
npm install -g laravel-echo-server
라라 벨 에코 서버를 설치합니다.
참고로 라라벨 에코서버를 이용할 때는 redis서버가 반드시 필요하기 때문에 사전작업의 redis서버를 준비해 주세요
그 후 라라벨 에코 서버 json파일을 작성해줍니다.
laravel-echo-server init
? Do you want to run this server in development mode? Yes
? Which port would you like to serve from? 6001
? Which database would you like to use to store presence channel members? redis
? Enter the host of your Laravel authentication server. http://localhost:8000
? Will you be serving on http or https? http
? Do you want to generate a client ID/Key for HTTP API? Yes
? Do you want to setup cross domain access to the API? Yes
? Specify the URI that may access the API: http://localhost:8000
? Enter the HTTP methods that are allowed for CORS: GET, POST
? Enter the HTTP headers that are allowed for CORS: Origin, Content-Type, X-Auth-Token, X-Requested-With, Accept, Autho
rization, X-CSRF-TOKEN, X-Socket-Id
? What do you want this config to be saved as? laravel-echo-server.json
appId: fb9e72802cace662
key: 9bf6eb178b5601e2353d387c9d46531b
init을 이용하면 위와 같이 설정을 할 수 있습니다.
마지막으로 라라벨 에코 서버를(laravel-echo-server start) 기동시 킵니다.
$laravel-echo-server start
L A R A V E L E C H O S E R V E R
version 1.5.3
Starting server...
✔ Running at localhost on port 6001
✔ Listening for http events...
✔ Listening for redis events...
Server ready!
혹시 아래와 같은 에러가 보인다면 redis서버가 준비되어있지 않은 상태이니 한번 확인해주세요!
[ioredis] Unhandled error event: Error: connect ECONNREFUSED 127.0.0.1:6379
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1097:14)
라라벨 쪽 작업
1. config/app.php 코드 수정
App\Providers\BroadcastServiceProvider::class,
프로바이더 쪽에 위의 코드를 추가시켜주세요
2.. env파일 변경
BROADCAST_DRIVER=log로 되어있는 곳을
BROADCAST_DRIVER=redis
redis로 변경해주세요
서버 쪽 작업
전체 송신 기능용으로 작성하겠습니다.
1. Event관련 함수 작성
php artisan make:event PublicEvent
artisan커멘드를 이용하여 작성합니다.
2. app/Events/PublicEvent.php 파일 수정
<?php
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
class PublicEvent implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Get the channels the event should broadcast on.
*
* @return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
// redis채널이름
return new Channel('public-event');
}
public function broadcastWith()
{
return [
"message" => "hello world",
];
}
}
위와 같이 코드를 변경해주세요.
3. route/web.php 코드 수정
어떤 이벤트가 발생해야 브로드캐스트가 가능하므로, 이벤트를 작성합니다.
이번 경우는 어떤 url로 접속했을 때 반응하는 브로드캐스트입니다.
Route::get('/public-event', function(){
broadcast(new \App\Events\PublicEvent())
return "return값은 없어도 상관없음.";
});
return 값은 없어도 상관없지만 화면에 아무것도 찍히지 않으면 헷갈리니까 넣어봤습니다.
클라이언트 쪽 작업
1. resources/js/bootstrap.js 코드 수정
//for Echo
import Echo from 'laravel-echo';
window.io = require('socket.io-client');
// 접속정보
window.Echo = new Echo({
broadcaster: 'socket.io',
host: 'http://localhost:6001',
});
// redis채널설정
window.Echo.channel('laravel_database_public-event')
.listen('PublicEvent', (e) => {
console.log(e);
});
위의 코드를 추가해주세요.
자세히는 모르겠지만, 저 같은 경우는 laravel_database_뒤에 채널 이름이 만들어졌습니다...
redis 로그를 이용하여 어떤 채널이 만들어졌는지 확인해주세요....
2. laravelMix이용
npm install
npm run dev
laravel Mix를 이용하여 public/js/app.js에 수정한 코드를 추가시켰습니다.
3. blade페이지 수정
저 같은 경우는 resources/views/welcome.blade.php 파일을 수정하였습니다.
<meta name="csrf-token" content="{{ csrf_token() }}">
<script src="{{ asset('js/app.js')}}"></script>
위의 두 코드를 추가합니다.
확인 작업
localhost:8000/public-event 화면과
localhost:8000의 화면을 동시에 켜놓고
public-event화면을 새로고침 하면 아래와 같은 hello world가 출력되는 것을 볼 수 있습니다.
'IT' 카테고리의 다른 글
[laravel] Laravel 6.0 LTS (0) | 2019.09.04 |
---|---|
PHP - 제너레이터 (0) | 2019.06.03 |
인터페이스&추상클래스 (0) | 2019.05.16 |
HTTP헤더 인젝션 (0) | 2019.05.15 |
[laravel 기초공부] 라라벨 - 06 (뷰 블레이드- 기본) (0) | 2019.05.13 |