Laravel의 브로드캐스트 모듈에 대한 자세한 설명

藏色散人
풀어 주다: 2020-04-12 14:12:31
앞으로
3952명이 탐색했습니다.

이 글은 Laravel 5.4 버전의 브로드캐스트 모듈 코드를 분석하고 작성한 내용을 바탕으로 작성되었습니다.

권장 사항: "laravel 튜토리얼"

소개

브로드캐스팅은 발신자가 메시지를 보내는 것을 의미하며, 각 수신자는 메시지를 보냅니다. 채널을 구독하면 메시지를 받을 수 있습니다. 예를 들어 친구 A가 기사를 작성하고 학생 A가 페이지를 새로 고치지 않고도 해당 기사에 댓글이 달렸다는 알림을 받게 됩니다. 동급생 A가 메시지를 받았다는 의미입니다. 이 방송 메시지는 동급생 B의 이 작업에 대한 댓글에 의해 트리거됩니다.

전체 방송 동작에는 채널이라는 중요한 개념이 있으며 채널 유형은

● 공개입니다. 채널 공개

● 비공개 채널 비공개

● 존재 채널 존재

이동 단말기가 공개 채널 공개를 구독하는 경우 비공개 채널 비공개 및 존재 채널 존재 구독 과정에서 직접적으로 성공 여부가 확인됩니다. 비공개 채널과 현재 상태 채널의 차이점은 비공개 채널이 다른 구성원이 보낸 메시지를 받을 수 있는 반면 현재 상태 채널은 다음과 같은 경우에도 메시지를 받을 수 있다는 것입니다.

브로드캐스팅은 다음 시나리오에 적합합니다(이 작은 부분은 Pusher 드라이버 기반 Laravel 이벤트 브로드캐스팅(1부)에서 발췌).

● 알림 또는 신호

알림은 가장 간단한 예이며 가장 자주 사용됩니다. 신호에는 UI가 없다는 점을 제외하면 신호는 알림의 한 형태로 볼 수도 있습니다.

● 활동 스트림

활동 스트림(피드)은 소셜 네트워크의 핵심입니다. 예를 들어 위챗 모멘트의 좋아요와 댓글은 A는 B의 좋아요를 실시간으로, B는 A의 댓글을 실시간으로 볼 수 있다.

●Chat

채팅 정보 실시간 표시

모듈 구성

Laravel의 브로드캐스트 모듈에 대한 자세한 설명

Demo

로그 드라이버

구성

.env 파일 수정 또는 줄 추가: BROADCAST_DRIVER =log;

Broadcast

직접

 $manager = app(Illuminate\Broadcasting\BroadcastManager::class);
 $driver = $manager->connection();
 // 第一个参数是频道名,第二个参数是事件名,第三个参数是广播内容
 $driver->broadcast(['channel_1', 'channel_2'], 'login', ['message' => 'hello world']);
로그인 후 복사

를 호출하는 로그 드라이버이기 때문에 프레임워크에서 구성한 로그 파일에 방송 내용이 기록되며 출력 메시지는 다음과 같습니다

[2017-08-18 20:45:49] local.INFO: Broadcasting [login] on channels [channel_1, channel_2] with payload:
{
    "message": "hello world"
}
로그인 후 복사

이벤트 브로드캐스트 듣기

이런 호출 방법은 ShouldBroadcast 인터페이스를 구현한 이벤트가 발생하면 브로드캐스트 작업이 수행된다는 것입니다(동시에 ShouldBroadcastNow라는 인터페이스도 있습니다. ShouldBroadcast 인터페이스는 ShouldBroadcastNow 인터페이스를 구현하는 이벤트가 대기열에 들어갈 때 그것을 sync라는 대기열에 넣는 것입니다.)

예를 들어

첫 번째 단계인 IlluminateAuthEventsLogin 이벤트는 트리거되는 이벤트입니다. 사용자가 성공적으로 로그인한 후 방송 기능을 구현할 수 있도록 약간 변경합니다.

class Login implements ShouldBroadcast {
    ......
    
    // 定义事件被触发时,广播频道;此处定义名为 first-channel 的私有频道
    public function broadcastOn() {
        return [
            new PrivateChannel('first-channel'),
        ];
    }
    
    // 自定义广播名称;如果方法未定义,默认以类名为事件名,此处的默认值是 Illuminate\Auth\Events\Login
    public function broadcastAs() {
        return 'login';
    }
}
로그인 후 복사

두 번째 단계에서는 app/Providers/EventServiceProvider.php에서 이벤트 모니터링을 등록합니다.

protected $listen = [
   ......
   'Illuminate\Auth\Events\Login' => [
        'App\Listeners\UserLogin',
   ],
];
로그인 후 복사

파일 app/Listeners/ UserLogin.php는 대략적으로 구현됩니다.

class UserLogin {
    public function __construct() {}
    
    public function handle(Login $event){
        \Log::info('Do UserLogin Listener: I was Login');
    }
}
로그인 후 복사

세 번째 단계는 이벤트를 트리거하고 브로드캐스트를 보내는 것입니다. 트리거 브로드캐스트에는 여러 유형이 있습니다. 방법:

1. 직접 이벤트 트리거

event(new Illuminate\Auth\Events\Login($user, true));
로그인 후 복사

2 도움말 기능 브로드캐스트, 이벤트를 간접적으로 트리거합니다.

broadcast(new Illuminate\Auth\Events\Login($user, true));
로그인 후 복사

3. 관리 클래스 브로드캐스트, 이벤트 간접 트리거, 직접 브로드캐스트

$manager = app(Illuminate\Broadcasting\BroadcastManager::class);
$manager->event(new Illuminate\Auth\Events\Login($user, true));
로그인 후 복사

4. 관리 클래스 브로드캐스트, 이벤트 간접 트리거, 대기열 넣기

$manager = app(Illuminate\Broadcasting\BroadcastManager::class);
$manager->queue(new Illuminate\Auth\Events\Login($user, true));
로그인 후 복사

푸셔 드라이버

푸셔는 서버가 보낼 때 제공되는 서비스입니다. 방송하면 Pusher에 요청을 보낸 다음 Pusher와 브라우저 또는 모바일 단말기가 유지하는 긴 연결을 통해 데이터와 상호 작용합니다.

BROADCAST_DRIVER=pusher
PUSHER_APP_ID=xxxxxxxxxxxxxxxxxxxxxx
PUSHER_APP_KEY=xxxxxxxxxxxxxxxxxxxxxx
PUSHER_APP_SECRET=xxxxxxxxxxxxxxxxxxxxxx
로그인 후 복사

Preparation

이벤트 모니터링

백그라운드 이벤트 모니터링에서는 여전히 "Driver" 부분의 "log" 로그인 예를 사용합니다. 프런트 엔드 페이지에는 다음 코드가 소개되어 있습니다.

<script src="https://js.pusher.com/4.1/pusher.min.js"></script>
<script>
// 打开 Pusher 的调试日志
Pusher.logToConsole = true;
// 定义 Pusher 变量
var pusher = new Pusher(&#39;PUSHER_APP_KEY的值&#39;, {
    cluster: &#39;ap1&#39;,
    encrypted: true
});
// 定义频道,绑定事件
var channel = pusher.subscribe(&#39;private-first-channel&#39;);
channel.bind(&#39;login&#39;, function(data) {
    alert(data);
});
</script>
로그인 후 복사

공개 채널을 구독하는 경우 비공개 채널(채널 이름이 비공개 -로 시작)인 경우 서버에 권한 확인을 요청하지 않습니다. 채널(채널 이름은 현재 상태로 시작)인 경우 해당 백엔드에서 비공개 채널 및 기존 채널의 권한을 정의해야 합니다.

채널 권한 정의입니다. Routes/channels.php에서 저자는 첫 번째 채널 채널에 대한 권한 콜백 함수를 정의합니다.

Broadcast::channel(&#39;first-channel&#39;, function ($user) {
    return (int) $user->id === 1;
});
로그인 후 복사

어떤 독자들은 궁금해할 수도 있습니다. 프런트엔드 페이지 private-first-channel이 구독하는 채널이 아닌가요? 백엔드가 첫 번째 채널 채널의 권한만 정의하는 이유는 무엇입니까? 그 이유는 백엔드에서 정의한 채널이 A라고 가정하면 Pusher에 전달된 비공개 채널이 비공개 A라고 불리기 때문입니다. 채널이 존재하면

Broadcast

입니다.

직접방송

$manager = app(Illuminate\Broadcasting\BroadcastManager::class);
$driver = $manager->connection();
// socket 参数是广播私有频道时排除的 socket, 每个浏览器端或者移动端在建立 websocket 时都会被分配一个 socket_id
$driver->broadcast([&#39;private-first-channel&#39;], &#39;login&#39;, [&#39;user&#39; => [&#39;name&#39; => &#39;hello&#39;], &#39;socket&#39; => &#39;5395.4377611&#39;]);
로그인 후 복사
간접방송

"로그 드라이버"에서 언급한 간접방송 방법 참고;

독점 브로드캐스트를 보내려면(즉, 클라이언트가 현재 요청을 제외한 브로드캐스트 메시지를 받지 않음) 다음 조건이 필요합니다.

1 이벤트는 IlluminateBroadcastingInteractsWithSockets 특성을 사용합니다. 프런트 엔드에서 보낸 헤더는 X-Socket-ID 정보를 전달해야 합니다.

3. 이벤트는 브로드캐스트(new IlluminateAuthEventsLogin($user, true))->toOthers();

Redis 드라이버

configuration

.env 파일 수정 또는 다음 줄을 추가하세요: BROADCAST_DRIVER=redis;

Broadcast

원칙은 Laravel 프레임워크가 Socket.IO 서버에 메시지를 게시하는 것입니다. 그리고 Socket.IO 서버는 브라우저와 통신하거나 모바일 단말기에서 긴 연결을 유지합니다.

저자는 아직 이 부분을 시연하지 않았으며 온라인에 소개 자료가 꽤 많이 있습니다.

이 부분을 시작하는 것이 훨씬 쉽습니다.

위 내용은 Laravel의 브로드캐스트 모듈에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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