이 글은 Laravel 5.4 버전의 브로드캐스트 모듈 코드를 분석하고 작성한 내용을 바탕으로 작성되었습니다.
권장 사항: "laravel 튜토리얼"
소개
브로드캐스팅은 발신자가 메시지를 보내는 것을 의미하며, 각 수신자는 메시지를 보냅니다. 채널을 구독하면 메시지를 받을 수 있습니다. 예를 들어 친구 A가 기사를 작성하고 학생 A가 페이지를 새로 고치지 않고도 해당 기사에 댓글이 달렸다는 알림을 받게 됩니다. 동급생 A가 메시지를 받았다는 의미입니다. 이 방송 메시지는 동급생 B의 이 작업에 대한 댓글에 의해 트리거됩니다.
전체 방송 동작에는 채널이라는 중요한 개념이 있으며 채널 유형은
● 공개입니다. 채널 공개
● 비공개 채널 비공개
● 존재 채널 존재
이동 단말기가 공개 채널 공개를 구독하는 경우 비공개 채널 비공개 및 존재 채널 존재 구독 과정에서 직접적으로 성공 여부가 확인됩니다. 비공개 채널과 현재 상태 채널의 차이점은 비공개 채널이 다른 구성원이 보낸 메시지를 받을 수 있는 반면 현재 상태 채널은 다음과 같은 경우에도 메시지를 받을 수 있다는 것입니다.
브로드캐스팅은 다음 시나리오에 적합합니다(이 작은 부분은 Pusher 드라이버 기반 Laravel 이벤트 브로드캐스팅(1부)에서 발췌).
● 알림 또는 신호
알림은 가장 간단한 예이며 가장 자주 사용됩니다. 신호에는 UI가 없다는 점을 제외하면 신호는 알림의 한 형태로 볼 수도 있습니다.
● 활동 스트림
활동 스트림(피드)은 소셜 네트워크의 핵심입니다. 예를 들어 위챗 모멘트의 좋아요와 댓글은 A는 B의 좋아요를 실시간으로, B는 A의 댓글을 실시간으로 볼 수 있다.
●Chat
채팅 정보 실시간 표시
모듈 구성
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('PUSHER_APP_KEY的值', { cluster: 'ap1', encrypted: true }); // 定义频道,绑定事件 var channel = pusher.subscribe('private-first-channel'); channel.bind('login', function(data) { alert(data); }); </script>
공개 채널을 구독하는 경우 비공개 채널(채널 이름이 비공개 -로 시작)인 경우 서버에 권한 확인을 요청하지 않습니다. 채널(채널 이름은 현재 상태로 시작)인 경우 해당 백엔드에서 비공개 채널 및 기존 채널의 권한을 정의해야 합니다.
채널 권한 정의입니다. Routes/channels.php에서 저자는 첫 번째 채널 채널에 대한 권한 콜백 함수를 정의합니다.Broadcast::channel('first-channel', 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(['private-first-channel'], 'login', ['user' => ['name' => 'hello'], 'socket' => '5395.4377611']);간접방송 "로그 드라이버"에서 언급한 간접방송 방법 참고;
독점 브로드캐스트를 보내려면(즉, 클라이언트가 현재 요청을 제외한 브로드캐스트 메시지를 받지 않음) 다음 조건이 필요합니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!