一個基於 Laravel5.4+Vue+Redis 實時聊天的小 demo

一個基於Laravel+Vue+Redis 實時聊天的小demophp

這篇是基於一個基於 Laravel5.4+Vue+Pusher 實時聊天的小 demovue

固然也能夠獨立出來,只須要把驅動換成 Redis 就能夠了laravel

GitHub 直達git

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

gitgithub

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

因爲 GitHub 是基於 Pusher 的 因此安裝以前須要一些修改redis

進入 composion.jsonsql

去掉 "pusher/pusher-php-server": "^2.6"

增長 "predis/predis": "^1.1"

而後 composer 安裝數據庫

cd project 

composer install

配置數據庫及 keynpm

cp .env.example .env

art key:generate

配置驅動json

BROADCAST_DRIVER=redis

遷移

art migtate

而後進入 package.json

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

yarn 或 npm 安裝

yarn 

npm

yarn 或者 npm 打包

yarn run dev

npm run dev

因爲 Redis 使用的 Socket.IO 所以須要配置客戶端 Socket.io 和服務員端 Socket.io

客戶端 Socket.IO

進入 bootstrap.js

window.Echo = new Echo({
    broadcaster: 'socket.io',
    host: 'http://yourdomain.app:6001'
});

進入 app.blade.php head 中增長

<script src="https://cdn.socket.io/socket.io-1.4.5.js"></script>

服務端 laravel-echo-server

yarn add laravel-echo-server

或者 npm install laravel-echo-server

安裝完成後 生成服務端的配置文件 啓動後會讀取這個配置文件

laravel-echo-server init

個人配置文件

{
    "authHost": "http://delo.app",
    "authEndpoint": "/broadcasting/auth",
    "clients": [],
    "database": "redis",
    "databaseConfig": {
        "redis": {},
        "sqlite": {
            "databasePath": "/database/laravel-echo-server.sqlite"
        }
    },
    "devMode": false,
    "host": "delo.app",
    "port": "6001",
    "protocol": "http",
    "socketio": {},
    "sslCertPath": "",
    "sslKeyPath": ""
}

若是不運行 laravel-echo-server init 的話 能夠新建一個 laravel-echo-server.json 的文件 複製上面的內容進去 修改爲你的主機就能夠了
最後在 app.blade.php 中引入

<script src="//yourdomain:6001/socket.io/socket.io.js"></script>

啓動

laravel-echo-server start

file

ok 最後註冊兩個帳號開始實驗吧

file

你可能發現 在一個瀏覽器每刷新一次後,另外一個瀏覽器的在線數都會加 1 ,可是用 pusher 的話就不會出現這個問題(這是爲何?)。奇怪

如何解決呢 其中走了好多彎路

剛開始的時候 想的是數組去重的方法

在 app.js 中你會發現

Echo.join('chatroom')
            .here((users) => {
                this.usersInRoom = users;
            })
            .joining((user) => {
                this.usersInRoom.push(user);
            })
            .leaving((user) => {
                this.usersInRoom = this.usersInRoom.filter(u => u != user)
            })
            .listen('MessagePosted', (e) => {
                this.messages.push({
                    message: e.message.message,
                    user: e.user
                });
            });

原本想着百度一個數組的去重方法 像這樣的

Array.prototype.unique = function(){
 var res = [];
 var json = {};
 for(var i = 0; i < this.length; i++){
  if(!json[this[i]]){
   res.push(this[i]);
   json[this[i]] = 1;
  }
 }
 return res;
}
var arr = [112,112,34,'你好',112,112,34,'你好','str','str1'];
alert(arr.unique());

但通過 leo 的指點 有個插件很是好用 lodash 安裝後

只需這樣

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

接下來 又是一個奇怪的事情 console.log(this.usersInRoom) 發現新增長的居然是一個對象。數組去重就不行了。

我厚着臉皮向 overtrue 發出了呼喚 。。

向超神簡單的描述一番後。 超神說 "返回的應該是對象,能夠考慮用 ID" 撥雲見日

this.usersRoom=users

users 既然是對象的話,讓它返回 id 就能夠了

users 是在哪裏返回的呢,在BroadcastServiceProvider發現

require base_path('routes/channels.php');

進入 routes/channels.php

Broadcast::channel('chatroom', function ($user) {
    return $user;
});

修改成

Broadcast::channel('chatroom', function ($user) {
        return $user->id;
    });

ok 柳暗花明!

總結: 雖然寫了基於 pusher 和 redis 廣播的兩個小 demo,但仍是遊離於配置層面。底層的東西仍是朦朦朧朧的。但對於剛入門的新手來講,這是比較有用的。由於我比較喜歡,先把東西呈現出來,而後再去深刻。

一個 demo 愛好者

相關文章
相關標籤/搜索