使用 Laravel-echo-server 构建实时应用

文章转发自专业的Laravel开发者社区,原始连接:learnku.com/laravel/t/1…php

在我看来,实时通讯才是 APP 应用的未来。 Socket 服务一般不是那么容易实现,可是 Laravel Echo 服务改变了这个状况。laravel

在本文中,我将会简要的介绍如何创建一个能够运行的 Socket 服务而且在这个服务上进行事件的广播。(github.com/tlaverdure/…, Laravel 的支持文档: laravel.com/docs/5.6/br…)git

它是彻底免费的,你只要运行你本身的 Socket 服务。你也可使用 Laravel 默认集成的 Pusher ,惟一的缺点是它是有限制的,若是超出限制则须要付费。我更喜欢本身来架构这些东西。github

要求:

  • Laravel 框架 (本教程使用了 5.6 版本)
  • Redis 服务
  • 基本的 Laravel 知识

安装 laravel-echo-server

首先咱们须要全局安装 laravel-echo-server ,你只需在终端输入下面的命令。web

$ npm install -g laravel-echo-server
复制代码

安装完成后,打开你的 Laravel 应用,或者新启一个测试项目:redis

$ composer create-project --prefer-dist laravel/laravel echo-test
复制代码

接下来为咱们的应用安装 Predis :npm

$ composer require predis/predis
复制代码

安装完成后,切换到项目根目录下,初始化 Socket 服务:json

$ laravel-echo-server init
复制代码

执行这条命令后,会询问你一些关于 Socket 服务的配置信息,你能够根据本身的状况填写:bootstrap

切记在生产环境中,不管你何时使用它,都应该关掉你的开发者模式。数组

咱们能够尝试启动服务,看看它是否正常运行:

$ laravel-echo-server start
复制代码

输出结果看起来像这样:

配置 Laravel 使 Laravel Echo Server 正常工做

打开你的  config/app.php 文件而且取消 BroadcastServiceProvider 在这个 Providers 数组中的注释:

App\Providers\BroadcastServiceProvider::class,

这个 Provider 将会启动广播路由(你或许已经在 routes/channels.php 文件里面已经看到了)

打开 .env  文件,修改  BROADCAST_DRIVER 的值为你在 laravel-echo-server 初始化时定义的值(Redis 或者 Log)。在本教程中咱们将使用 Redis 驱动程序。 同时修改  QUEUE_DRIVER 为你喜欢的任何队列驱动程序,在这个示例中你能够轻松的将其更改成 Redis 驱动程序,由于你在前面已经安装而且在运行了。

接下来咱们必须安装 Socket.io 客户端和 Laravel-Echo 包,你能够经过如下操做来安装:

$ npm install --save socket.io-client
$ npm install --save laravel-echo
复制代码

(在运行这个以前你可能须要运行  npm install  来安装 Laravel 及相关依赖)

接下来打开  resources/assets/js/bootstrap.js  文件, 或者你本身的 引入全部 JS 基础代码的 JS 文件。

如今咱们要添加启动 Echo 基础服务的代码:

import Echo from 'laravel-echo'

window.io = require('socket.io-client');
window.Echo = new Echo({
    broadcaster: 'socket.io',
    host: window.location.hostname + ':6001'
}); 
复制代码

如今咱们准备在频道上监听消息了!我会在本教程中解释怎么开放频道,接下来开始收听咱们的第一个频道:

window.Echo.channel('test-event')
    .listen('ExampleEvent', (e) => {
        console.log(e);
    });
复制代码

咱们经过 JS 代码告诉程序咱们订阅了名为 ’test-event' 的频道, 并监听 ‘ExampleEvent’ 事件 (这是事件的类名,你也能够根据你的须要自定义)。

让咱们建立这个事件类:

$ php artisan make:event ExampleEvent
复制代码

这将会在 App/Events 目录下面建立一个叫作 ExampleEvent.php 的事件类 让咱们对这个事件类稍做调整使得它可以在咱们的 Socket 服务 中可以正常运行,首先确保你的事件类继承于 ShouldBroadcast 接口,就像下面这样;

class ExampleEvent implements ShouldBroadcast

接下来向下滚动找到  broadcastOn  函数,修改它使得咱们可以在正确的频道上进行广播:

public function broadcastOn()
{
    return new Channel('test-event');
}
复制代码

让咱们在下面新建一个函数,这样咱们才能有一些实例数据:

public function broadcastWith()
{
    return [
        'data' => 'key'
    ];
}
复制代码

这个函数在事件被调用时调用,它将会把数据返回到你的 Socket 服务中。

如今让咱们开始尝试它吧!打开你的 routes/web.php 文件而且新增一个测试路由:

Route::get('test-broadcast', function(){
    broadcast(new \App\Events\ExampleEvent);
});
复制代码

(有不少种方式来广播 ExampleEvent  类 ,在这个示例中我使用 Laravel 提供的 broadcast() 助手,在我看来这是最简洁的方式)

启动队列监听:

$ php artisan queue:listen --tries=1
复制代码

浏览器打开一个包含 JS 文件的页面(能够是 Laravel 默认的欢迎页面),这是第一个页面,请不要关闭次页面,咱们已经在此页面上订阅了 Socket 服务。

接下来打开另外一个页面访问  /test-broadcast ,这将会返回一个空白页面,可是它将会经过你的 ExampleEvent  类广播到你的 Socket 服务上。返回到咱们的第一个页面,打开浏览器控制台,应该能够看到相似信息:

正如你所看到的,数据经过这种形式展现在咱们的客户端。你能输入任意数据经过你的  ExampleEvent 类来广播他们,这些数据能够是新闻更新,页面更新,总浏览量或者更多。

由于咱们有在 laravel-echo-server 配置中有设置开发者模式,因此你能看到 Socket 服务上的全部基本信息:

如今你已经安装并运行了一个基本的 Socket 服务!但这并非所有,你能够根据这个来作更多的事情,好比为单个用户提供认证的私有渠道。(当您想广播订单更新或私人消息时)

要作到这一点,我建议你去查看 Laravel 文档了解更多相关的内容。经过这个主题你能作不少事情,让你的应用程序变得更加神奇。你能够在这里找到相应的文档:

Broadcasting - Laravel - The PHP framework for web artisans.laravel.com

其余: 在生产环境中运行

正如我以前所说,你必须在 laravel-echo-server.json 配置文件中禁用开发者模式。 固然在服务器上你能够忽略这个文件,从新初始化它,由于你的主机可能和本地不一样。

你还须要保持你的 Socket 服务在你的生产环境中运行,你能够用 Supervisor ,可是我一般使用 *PM2 * ,它能够方便快速的管理你的服务。 (http://pm2.keymetrics.io/)

这里是我使用 PM2 的 Socket.sh 基本配置:

#!/usr/bin/env bash 
laravel-echo-server  start
复制代码

安装了 PM2 后, 你能够经过 pm2 start socket.sh 命令来启动脚本,运行你的 Socket 服务。

我但愿它可以帮助到你。 这篇文章主要介绍的是一些基础知识,接下来咱们会继续讨论广播路由的受权和不一样的广播频道。

感谢你的阅读!

相关文章
相关标签/搜索