이 글에서는 주로 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 'wechat.login'; } }
BroadcastOn 메소드는 방송할 채널을 나타내는 배열을 반환해야 하고, BroadcastAs는 브로드캐스트에 의해 트리거된 이벤트를 나타내는 문자열 Laravel은 기본적으로 이벤트 클래스의 전체 클래스 이름을 반환합니다. 여기 AppEventsWechatLoginedEvent가 있습니다. 가장 중요한 것은 이 클래스가 ShouldBroadcast 계약을 구현하도록 해야 한다는 것입니다. Laravel은 이벤트를 생성할 때 이 네임스페이스를 자동으로 추가했으며 이 계약은 BroadcastOn 메서드만 제한합니다.
이벤트가 완료된 후 다음 단계는 간단한 코드 한 줄이면 충분합니다.
event(new WechatLoginedEvent($token, $channel));
RedisBroadcaster는 해당 채널을 통해 이벤트에서 공개적으로 액세스할 수 있는 데이터를 게시합니다. 노출된 데이터를 더 세밀하게 제어하려면 배열을 반환하는 BroadcastWith 메서드를 이벤트에 추가하면 됩니다.
/** * Get the data to broadcast. * * @return array */ public function broadcastWith() { return ['user' => $this->user->id]; }
Node.js 및 Socket.io 对于发布出去的信息,我们需要一个服务来对接,让其能对 redis 的发布能够进行订阅,并且能把信息以 WebSocket 协议转发出去,这里我们可以借用 Node.js 和 socket.io 来非常方便的构建这个服务: 这里我们使用 Node.js 引入 socket.io 服务端并监听 6001 端口,借用 redis 的 psubscribe 指令使用通配符来快速的批量订阅,接着在消息触发时将消息通过 WebSocket 转发出去。 Socket.io 客户端 在 web 前端,我们需要引入 Socket.io 客户端开启与服务端 6001 端口的通讯,并订阅频道事件: 至此整个通讯闭环结束,开发流程看起来就是这样的: 在 Laravel 中构建一个支持广播通知的事件 设置需要进行广播的频道及事件名称 将广播设置为使用 redis 驱动 提供一个持续的服务用于订阅 redis 的发布,及将发布内容通过 WebSocket 协议推送到客户端 客户端打开服务端 WebSocket 隧道,并对事件进行订阅,根据指定事件的推送进行响应。 总结 위 내용은 Laravel의 인스턴트 애플리케이션 구축 방법 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!// server.js
var app = require('http').createServer(handler);
var io = require('socket.io')(app);
var Redis = require('ioredis');
var redis = new Redis();
app.listen(6001, function () {
console.log('Server is running!') ;
});
function handler(req, res) {
res.writeHead(200);
res.end('');
}
io.on('connection', function (socket) {
socket.on('message', function (message) {
console.log(message)
})
socket.on('disconnect', function () {
console.log('user disconnect')
})
});
redis.psubscribe('*', function (err, count) {
});
redis.on('pmessage', function (subscrbed, channel, message) {
message = JSON.parse(message);
io.emit(channel + ':' + message.event, message.data);
});
// client.js
let io = require('socket.io-client')
var socket = io(':6001')
socket.on($channel + ':wechat.login', (data) => {
socket.close()
// save user token and redirect to dashboard
})