>  기사  >  백엔드 개발  >  Laravel에서 인스턴트 애플리케이션을 구축하는 구현 방법 소개

Laravel에서 인스턴트 애플리케이션을 구축하는 구현 방법 소개

巴扎黑
巴扎黑원래의
2017-09-01 15:26:291328검색

이 글에서는 주로 Laravel에서 인스턴트 애플리케이션을 구축하는 방법을 소개합니다. 인스턴트 메시징은 일상적인 개발에서 자주 접하게 됩니다. 이 글에서는 샘플 코드를 통해 자세히 소개합니다. 아래 편집자.

인스턴트 대화형 애플리케이션

가장 일반적인 결제 콜백 및 제3자 로그인과 같은 최신 웹 애플리케이션의 다양한 시나리오에서 인스턴트 메시징이 필요하다는 사실을 누구나 경험했을 것입니다. 이러한 비즈니스 시나리오는 기본적으로 다음 프로세스를 따라야 합니다.

  • 클라이언트는 관련 비즈니스를 트리거하고 타사 애플리케이션 작업(예: 결제)을 생성합니다.

  • 클라이언트는 서버 응답 결과를 기다립니다(사용자가 작업을 완료합니다) )

  • 서드파티 애플리케이션이 서버에 처리 결과를 통보합니다(결제 완료)

  • 서버가 클라이언트에게 처리 결과를 통보합니다

  • 클라이언트가 피드백을 합니다 결과에 따라 (결제 성공 페이지로 이동)

과거에는 이러한 인스턴트 메시징을 구현하고 클라이언트가 처리 결과에 올바르게 응답할 수 있도록 하기 위해 가장 일반적으로 사용되는 기술이 폴링이었기 때문입니다. HTTP 프로토콜의 단방향 특성상 클라이언트는 처리 결과를 서버에 계속해서 적극적으로 요청할 수만 있습니다. 이 방법에는 서버측 리소스를 차지할 뿐만 아니라 서버측 처리 결과를 실시간으로 얻을 수 없다는 명백한 결함이 있습니다.

이제 WebSocket 프로토콜을 사용하여 실시간 상호 작용을 처리할 수 있습니다. 이는 서버가 클라이언트에 정보를 적극적으로 푸시할 수 있게 해주는 양방향 프로토콜입니다. 이 기사에서는 Laravel의 강력한 이벤트 시스템을 사용하여 실시간 상호 작용을 구축할 것입니다. 다음에 대한 지식이 필요합니다:

  • Laravel Event

  • Redis

  • Socket.io

  • Node.js

Redis

시작하기 전에 시작이 필요합니다. Redis 서비스를 제공하고 Laravel 애플리케이션에서 이를 구성 및 활성화합니다. 프로세스 전반에 걸쳐 인스턴트 메시징을 달성하려면 Redis의 구독 및 게시 메커니즘을 사용해야 하기 때문입니다.

Redis는 오픈 소스이자 효율적인 키-값 저장 시스템입니다. 일반적으로 키-값 쌍을 저장하는 데이터 구조 서버로 사용되며 문자열, 해시, 목록, 집합 및 순서가 지정된 조합을 지원할 수 있습니다. Laravel에서 Redis를 사용하려면 Composer를 통해 predis/predis 패키지 파일을 설치해야 합니다.

Configuration

애플리케이션의 Redis 구성 파일은 config/database.php에 저장됩니다. 이 파일에서 Redis 서비스 정보가 포함된 redis 배열을 볼 수 있습니다.


'redis' => [
 'cluster' => false,

 'default' => [
 'host' => '127.0.0.1',
 'port' => 6379,
 'database' => 0,
 ],
]

Redis 서비스의 포트를 수정했습니다. 구성 파일의 포트를 일관되게 유지하세요.

Laravel Event

여기서 Laravel의 강력한 이벤트 브로드캐스팅 기능을 사용해야 합니다.

Broadcast Events

많은 최신 애플리케이션에서 웹 소켓은 실시간 대화형 사용자 인터페이스를 구현하는 데 사용됩니다. 서버에서 일부 데이터가 변경되면 WebSocket 연결을 통해 처리하기 위해 메시지가 클라이언트에 전달됩니다.

이러한 유형의 애플리케이션을 구축하는 데 도움이 됩니다. Laravel을 사용하면 WebSocket 연결을 통해 이벤트를 쉽게 브로드캐스트할 수 있습니다. Laravel을 사용하면 이벤트 이름을 서버측 및 클라이언트측 JavaScript 프레임워크에 공유하기 위해 이벤트를 브로드캐스트할 수 있습니다.

Configuration

모든 이벤트 방송 구성 옵션은 config/broadcasting.php 구성 파일에 저장됩니다. Laravel에는 Pusher, Redis 및 Log와 같은 여러 가지 사용 가능한 드라이버가 함께 제공됩니다. 우리는 predis/predis 클래스 라이브러리가 필요한 브로드캐스트 드라이버로 Redis를 사용할 것입니다.

기본 브로드캐스트 드라이버는 푸셔를 사용하므로 .env 파일 BROADCAST_DRIVER=redis에서 설정해야 합니다.

사용자가 WeChat을 검색하여 로그인한 후 방송할 WechatLoginedEvent 이벤트 클래스를 생성합니다.


<?php

namespace App\Events;

use App\Events\Event;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class WechatLoginedEvent extends Event implements ShouldBroadcast
{
 use SerializesModels;

 public $token;
 protected $channel;

 /**
  * Create a new event instance.
  *
  * @param string $token
  * @param string $channel
  * @return void
  */
 public function __construct($token, $channel)
 {
  $this->token = $token;
  $this->channel = $channel;
 }

 /**
  * Get the channels the event should be broadcast on.
  *
  * @return array
  */
 public function broadcastOn()
 {
  return [$this->channel];
 }

 /**
  * Get the name the event should be broadcast on.
  *
  * @return string
  */
 public function broadcastAs()
 {
  return &#39;wechat.login&#39;;
 }
}

BroadcastOn 메소드는 방송할 채널을 나타내는 배열을 반환해야 하고, BroadcastAs는 브로드캐스트에 의해 트리거된 이벤트를 나타내는 문자열 Laravel은 기본적으로 이벤트 클래스의 전체 클래스 이름을 반환합니다. 여기 AppEventsWechatLoginedEvent가 있습니다. 가장 중요한 것은 이 클래스가 ShouldBroadcast 계약을 구현하도록 해야 한다는 것입니다. Laravel은 이벤트를 생성할 때 이 네임스페이스를 자동으로 추가했으며 이 계약은 BroadcastOn 메서드만 제한합니다.

이벤트가 완료된 후 다음 단계는 간단한 코드 한 줄이면 충분합니다.

event(new WechatLoginedEvent($token, $channel));

이 작업은 자동으로 이벤트 실행을 트리거하고 정보를 방송합니다. 기본 브로드캐스트 작업은 Redis의 구독 및 게시 메커니즘에 의존합니다.

RedisBroadcaster는 해당 채널을 통해 이벤트에서 공개적으로 액세스할 수 있는 데이터를 게시합니다. 노출된 데이터를 더 세밀하게 제어하려면 배열을 반환하는 BroadcastWith 메서드를 이벤트에 추가하면 됩니다.

/**
 * Get the data to broadcast.
 *
 * @return array
 */
 public function broadcastWith() 
 {
 return [&#39;user&#39; => $this->user->id];
 }

Node.js 및 Socket.io

对于发布出去的信息,我们需要一个服务来对接,让其能对 redis 的发布能够进行订阅,并且能把信息以 WebSocket 协议转发出去,这里我们可以借用 Node.js 和 socket.io 来非常方便的构建这个服务:


// server.js
var app = require(&#39;http&#39;).createServer(handler);
var io = require(&#39;socket.io&#39;)(app);

var Redis = require(&#39;ioredis&#39;);
var redis = new Redis();

app.listen(6001, function () {
 console.log(&#39;Server is running!&#39;) ;
});

function handler(req, res) {
 res.writeHead(200);
 res.end(&#39;&#39;);
}

io.on(&#39;connection&#39;, function (socket) {
 socket.on(&#39;message&#39;, function (message) {
 console.log(message)
 })
 socket.on(&#39;disconnect&#39;, function () {
 console.log(&#39;user disconnect&#39;)
 })
});


redis.psubscribe(&#39;*&#39;, function (err, count) {
});

redis.on(&#39;pmessage&#39;, function (subscrbed, channel, message) {
 message = JSON.parse(message);
 io.emit(channel + &#39;:&#39; + message.event, message.data);
});

这里我们使用 Node.js 引入 socket.io 服务端并监听 6001 端口,借用 redis 的 psubscribe 指令使用通配符来快速的批量订阅,接着在消息触发时将消息通过 WebSocket 转发出去。

Socket.io 客户端

在 web 前端,我们需要引入 Socket.io 客户端开启与服务端 6001 端口的通讯,并订阅频道事件:


// client.js
let io = require(&#39;socket.io-client&#39;)

var socket = io(&#39;:6001&#39;)
  socket.on($channel + &#39;:wechat.login&#39;, (data) => {
  socket.close()
  // save user token and redirect to dashboard
})

至此整个通讯闭环结束,开发流程看起来就是这样的:

  • 在 Laravel 中构建一个支持广播通知的事件

  • 设置需要进行广播的频道及事件名称

  • 将广播设置为使用 redis 驱动

  • 提供一个持续的服务用于订阅 redis 的发布,及将发布内容通过 WebSocket 协议推送到客户端

  • 客户端打开服务端 WebSocket 隧道,并对事件进行订阅,根据指定事件的推送进行响应。

위 내용은 Laravel에서 인스턴트 애플리케이션을 구축하는 구현 방법 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.