《PHP学习:Laravel构建即时应用的一种实现方法详解》要点:
本文介绍了PHP学习:Laravel构建即时应用的一种实现方法详解,希望对您有用。如果有疑问,可以联系我们。
PHP实战即时交互的应用
PHP实战大家应该都有所体会,在现代的 Web 应用中很多场景都需要运用到即时通讯,比如说最常见的支付回调,与三方登录.这些业务场景都基本需要遵循以下流程:
PHP实战在过去,为了实现这种即时通讯,能让客户端正确响应处理结果,最为常用的技术就是轮询,因为 HTTP 协议的单向性,客户端只能一遍一遍的主动询问服务端的处理结果.这种方式有显见的缺陷,占用服务端资源不说,还不能实时获得服务端处理结果.
PHP实战现在,我们可以使用 WebSocket 协议来处理实时交互,它是一种双向协议,允许服务端主动推送信息到客户端.本篇我们将借助 Laravel 强大的事件系统来构建实时的交互.你将需要用到以下知识:
PHP实战Redis
PHP实战在开始之前,我们需要开启一个 redis 服务,并在 Laravel 应用中进行配置启用,因为在整个流程中,我们需要借助 redis 的订阅和发布机制来实现即时通讯.
PHP实战Redis 是一个开源高效的键值对存储系统.它通常作为一个数据结构服务器来存储键值对,它可以支持字符串,散列,列表,集合和有序结合.在 Laravel 中使用 Redis 你需用通过 Composer 来安装 predis/predis 包文件.
PHP实战配置
PHP实战Redis 在应用中的配置文件存储在 config/database.php,在这个文件中,你可以看到一个包含了 Redis 服务信息的 redis 数组:
PHP实战 'redis' => [ 'cluster' => false, 'default' => [ 'host' => '127.0.0.1', 'port' => 6379, 'database' => 0, ], ]
PHP实战如果你修改了 redis 服务的端口,请保持配置文件中的端口一致.
PHP实战Laravel Event
PHP实战这里我们需要借助 Laravel 强大的事件广播能力:
PHP实战广播事件
PHP实战很多现代化的应用中,会使用 Web Sockets 来实现实时交互的用户接口.当一些数据在服务端变更时,一条消息会通过 WebSocket 连接来传递到客户端进行处理.
PHP实战为了帮助你构建这种类型的应用.Laravel 使通过 WebSocket 连接进行广播事件变的非常简单.Laravel 允许你广播事件来共享事件的名称到你的服务端和客户端的 JavaScript 框架.
PHP实战配置
PHP实战所有的事件广播配置选项都被存储在 config/broadcasting.php 配置文件中.Laravel 附带了几种可用的驱动如 Pusher,Redis,和 Log,我们将使用 Redis 作为广播驱动,这里需要依赖 predis/predis 类库.
PHP实战由于默认的广播驱动使用的是 pusher,所以我们需要在 .env 文件中设置 BROADCAST_DRIVER=redis
.
PHP实战我们创建一个 WechatLoginedEvent 事件类用来在用户扫描微信登录后进行广播:
PHP实战 <?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'; } }
PHP实战其中你需要注意 broadcastOn 方法应返回一个数组,它表示所需广播的频道,而 broadcastAs 返回的是一个字符串,它表示广播所触发的事件,Laravel 默认的是返回事件类的全类名,这里是 App\Events\WechatLoginedEvent.
PHP实战最重要的是你需要手动的让该类实现 ShouldBroadcast 契约.Laravel 在生成事件时,已经自动添加了该命名空间,该契约只约束 broadcastOn 方法.
PHP实战事件完成接下来就是触发事件了,简单的一行代码就可以:
PHP实战 event(new WechatLoginedEvent($token, $channel));
PHP实战这个操作会自动的触发事件的执行并将信息广播出去.该广播操作底层借助了 redis 的订阅和发布机制.
PHP实战RedisBroadcaster 会将事件中的允许公开访问的数据通过给定的频道发布出去.如果你想对公开的数据拥有更多的控制,你可以在事件中添加 broadcastWith 方法,它应该返回一个数组:
PHP实战 /** * Get the data to broadcast. * * @return array */ public function broadcastWith() { return ['user' => $this->user->id]; }
PHP实战Node.js 和 Socket.io
PHP实战对于发布出去的信息,我们需要一个服务来对接,让其能对 redis 的发布能够进行订阅,并且能把信息以 WebSocket 协议转发出去,这里我们可以借用 Node.js 和 socket.io 来非常方便的构建这个服务:
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); });
转载请注明本页网址:
http://www.vephp.com/jiaocheng/198.html