资讯专栏INFORMATION COLUMN

一个基于 Laravel5.4+Vue+Redis 实时聊天的小 demo

chengjianhua / 1489人阅读

摘要:我厚着脸皮向发出了呼唤。。向超神简单的描述一番后。底层的东西还是朦朦胧胧的。但对于刚入门的新手来说,这是比较有用的。

一个基于Laravel+Vue+Redis 实时聊天的小demo

这篇是基于一个基于 Laravel5.4+Vue+Pusher 实时聊天的小 demo

当然也可以独立出来,只需要把驱动换成 Redis 就可以了

GitHub 直达

</>复制代码

  1. https://github.com/jplhomer/laravel-realtime-chat-demo

git

</>复制代码

  1. git clone https://github.com/jplhomer/laravel-realtime-chat-demo project

由于 GitHub 是基于 Pusher 的 所以安装之前需要一些修改

进入 composion.json

</>复制代码

  1. 去掉 "pusher/pusher-php-server": "^2.6"
  2. 增加 "predis/predis": "^1.1"

然后 composer 安装

</>复制代码

  1. cd project
  2. composer install

配置数据库及 key

</>复制代码

  1. cp .env.example .env
  2. art key:generate

配置驱动

</>复制代码

  1. BROADCAST_DRIVER=redis

迁移

</>复制代码

  1. art migtate

然后进入 package.json

</>复制代码

  1. 去掉 "pusher-js": "^4.0.0"

yarn 或 npm 安装

</>复制代码

  1. yarn
  2. npm

yarn 或者 npm 打包

</>复制代码

  1. yarn run dev
  2. npm run dev

由于 Redis 使用的 Socket.IO 因此需要配置客户端 Socket.io 和服务员端 Socket.io

客户端 Socket.IO

进入 bootstrap.js

</>复制代码

  1. window.Echo = new Echo({
  2. broadcaster: "socket.io",
  3. host: "http://yourdomain.app:6001"
  4. });

进入 app.blade.php head 中增加

</>复制代码

服务端 laravel-echo-server

</>复制代码

  1. yarn add laravel-echo-server
  2. 或者 npm install laravel-echo-server

安装完成后 生成服务端的配置文件 启动后会读取这个配置文件

</>复制代码

  1. laravel-echo-server init
  2. 我的配置文件
  3. {
  4. "authHost": "http://delo.app",
  5. "authEndpoint": "/broadcasting/auth",
  6. "clients": [],
  7. "database": "redis",
  8. "databaseConfig": {
  9. "redis": {},
  10. "sqlite": {
  11. "databasePath": "/database/laravel-echo-server.sqlite"
  12. }
  13. },
  14. "devMode": false,
  15. "host": "delo.app",
  16. "port": "6001",
  17. "protocol": "http",
  18. "socketio": {},
  19. "sslCertPath": "",
  20. "sslKeyPath": ""
  21. }

如果不运行 laravel-echo-server init 的话 可以新建一个 laravel-echo-server.json 的文件 复制上面的内容进去 修改成你的主机就可以了
最后在 app.blade.php 中引入

</>复制代码

启动

</>复制代码

  1. laravel-echo-server start

ok 最后注册两个账号开始实验吧

你可能发现 在一个浏览器每刷新一次后,另一个浏览器的在线数都会加 1 ,但是用 pusher 的话就不会出现这个问题(这是为什么?)。奇怪

如何解决呢 其中走了好多弯路

刚开始的时候 想的是数组去重的方法

在 app.js 中你会发现

</>复制代码

  1. Echo.join("chatroom")
  2. .here((users) => {
  3. this.usersInRoom = users;
  4. })
  5. .joining((user) => {
  6. this.usersInRoom.push(user);
  7. })
  8. .leaving((user) => {
  9. this.usersInRoom = this.usersInRoom.filter(u => u != user)
  10. })
  11. .listen("MessagePosted", (e) => {
  12. this.messages.push({
  13. message: e.message.message,
  14. user: e.user
  15. });
  16. });

本来想着百度一个数组的去重方法 像这样的

</>复制代码

  1. Array.prototype.unique = function(){
  2. var res = [];
  3. var json = {};
  4. for(var i = 0; i < this.length; i++){
  5. if(!json[this[i]]){
  6. res.push(this[i]);
  7. json[this[i]] = 1;
  8. }
  9. }
  10. return res;
  11. }
  12. var arr = [112,112,34,"你好",112,112,34,"你好","str","str1"];
  13. alert(arr.unique());

但经过 leo 的指点 有个插件非常好用 lodash 安装后

只需这样

</>复制代码

  1. this.usersInRoom=_.uniq(this.usersInRoom)

接下来 又是一个奇怪的事情 console.log(this.usersInRoom) 发现新增加的竟然是一个对象。数组去重就不行了。

我厚着脸皮向 overtrue 发出了呼唤 。。

向超神简单的描述一番后。 超神说 "返回的应该是对象,可以考虑用 ID" 拨云见日

</>复制代码

  1. this.usersRoom=users

users 既然是对象的话,让它返回 id 就可以了

users 是在哪里返回的呢,在BroadcastServiceProvider发现

</>复制代码

  1. require base_path("routes/channels.php");

进入 routes/channels.php

</>复制代码

  1. Broadcast::channel("chatroom", function ($user) {
  2. return $user;
  3. });

修改为

</>复制代码

  1. Broadcast::channel("chatroom", function ($user) {
  2. return $user->id;
  3. });

ok 柳暗花明!

总结: 虽然写了基于 pusher 和 redis 广播的两个小 demo,但还是游离于配置层面。底层的东西还是朦朦胧胧的。但对于刚入门的新手来说,这是比较有用的。因为我比较喜欢,先把东西呈现出来,然后再去深入。

一个 demo 爱好者

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/83772.html

相关文章

  • 一个基于 Laravel5.4+Vue+Redis 实时聊天的小 demo

    摘要:我厚着脸皮向发出了呼唤。。向超神简单的描述一番后。底层的东西还是朦朦胧胧的。但对于刚入门的新手来说,这是比较有用的。 一个基于Laravel+Vue+Redis 实时聊天的小demo 这篇是基于一个基于 Laravel5.4+Vue+Pusher 实时聊天的小 demo 当然也可以独立出来,只需要把驱动换成 Redis 就可以了 GitHub 直达 https://github.com...

    lanffy 评论0 收藏0
  • 全栈开发——动手打造属于自己的直播间(Vue+SpringBoot+Nginx)

    摘要:经过琢磨,其实是要考虑安全性的。具体在以下几个方面跨域连接协议升级前握手拦截器消息信道拦截器对于跨域问题,我们可以通过方法来设置可连接的域名,防止跨站连接。 前言 大学的学习时光临近尾声,感叹时光匆匆,三年一晃而过。同学们都忙着找工作,我也在这里抛一份简历吧,欢迎各位老板和猎手诚邀。我们进入正题。直播行业是当前火热的行业,谁都想从中分得一杯羹,直播养活了一大批人,一个平台主播粗略估计就...

    e10101 评论0 收藏0
  • 造个轮子,基于 Laravel5.4 的下一代 PHP 开发框架 (API/SPA/Vue2/iVi

    摘要:像操作系统一样,你可以通过安装软件,成为适用于你的电脑。先进的技术方案,使得你无需担心后期功能拓展与迭代问题,大大降低了维护成本。对于一个超过三年生命周期的项目来说,最适合不过。总之,是新的技术方向标,能让每个艺术家像构建工程一样构建程序。 这是我们团队的一个非盈利项目,以Apache2.0协议开源...不限制商用 Notadd是什么 Notadd 是基于Laravel 和 Vue 的...

    Rocture 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<