Laravel后台作为客户端,socket或mqtt作为服务端,App或其他作为另一个客户端
Laravel事件广播+redis+socket.io 或 mqtt
简介
laravel API 与 Android App 进行通讯,推送消息,或者是其他的使用的场景。
1.后台安装所需
- 新建 Laravel 项目
composer create-project laravel/laravel demo --prefer-dist
- 新建 Laravel 项目
- 安装 redis
composer require predis/predis
- 安装 redis
- 配置 redis
修改 config/database.php'redis' => [ 'client' => env('REDIS_CLIENT', 'phpredis'), 'options' => [ 'cluster' => env('REDIS_CLUSTER', 'redis'), // 'prefix' => env(...) 注释掉这一行 ], ... ]
- 配置 redis
- 修改 App\Providers\EventServiceProvider.php 中的
$listen
然后使用命令自动生成protected $listen = [ 'App\Events\TestEvent' => [ 'App\Listeners\TestEventListener', ], ];
Events
和Listeners
文件php artisan event:generate
- 修改 App\Providers\EventServiceProvider.php 中的
TestEvent.php 实现
<?php namespace App\Events; use ... 略 class TestEvent implements ShouldBroadcast { use ... 略 public $token; protected $channel; public function __construct($token, $channel) { $this->token = $token; $this->channel = $channel; } public function broadcastOn() { return [$this->channel]; } }
TestEventListener.php 实现
<?php namespace App\Listeners; use App\Events\TestEvent; use ... 略 class TestEventListener implements ShouldQueue { use InteractsWithQueue; protected $request; public function __construct(Request $request) { $this->request = $request; } public function handle(TestEvent $event){} public function log($event){ info("event -------- ".$event->token); } public function subscribe($events) { $events->listen( TestEvent::class, 'App\Listeners\TestEventListener@log' ); } }
- 在 EventServiceProvider.php 中新增或修改
protected $subscribe = [ TestEventListener::class, ];
- 在 EventServiceProvider.php 中新增或修改
- 新建 node 项目
新建 demo 目录,在目录中新建 package.json 文件,并输入{ "name": "demo", "version": "0.0.1", "description": "socket server", "dependencies": {} }
- 新建 node 项目
- socket 服务器
- 2.1 socket 安装所需
npm install --save express npm install --save socket.io npm install --save ioredis
- 2.1 socket 安装所需
2.2 新建 app.js
// app.js const express = require('express'); const app = express(); const port = process.env.PORT || 3000; const server = require('http').createServer(app); const io = require('socket.io')(server, { cors: true,//开启跨域 maxHttpBufferSize: 1e8//单次最大数据,初始为1e6 }); var Redis = require('ioredis'); var redis = new Redis({ port: 6379, // Redis port host: '127.0.0.1', // Redis host password:null, db: 0, }); server.listen(port, () => { appLogger.debug('Server listening at port %d', port); }); 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); var obj = { channel : channel, message:message }; io.emit("message",JSON.stringify(obj)); });
使用
node app.js
执行该服务或使用 pm2 方式
- 2.3 js客户端页面 其他类型客户端类似
// 网上有在线jquery和socket.io可用 <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="socket.io.js"></script> <script type="text/javascript"> $(function(){ var socket = io.connect('http://ip:3000'); socket.on('message', function (data) { console.log("接收到通知:"+data); }); }); </script>
- 2.3 js客户端页面 其他类型客户端类似
3 mqtt 服务器
- 3.1 mqtt 安装所需
npm install --save mqtt npm install --save mosca npm install --save ioredis
- 3.1 mqtt 安装所需
3.2 新建 app.js
// app.js var mosca = require('mosca'); var mqtt = require('mqtt'); var Redis = require('ioredis'); var client = mqtt.connect('mqtt://127.0.0.1'); var MqttServer = new mosca.Server({ port: 1883 }); var redis = new Redis({ port: 6379, // Redis port host: '127.0.0.1', // Redis host password: null, db: 0, }); MqttServer.on('clientConnected', function (client) { console.log('client connected', client.id); }); MqttServer.on('published', function (packet, client) { var topic = packet.topic; switch (topic) { case 'test': console.log('message-publish', packet.payload.toString()); break; case 'other': console.log('message-other', packet.payload.toString()); break; } }); MqttServer.on('ready', function () { console.log('mqtt is running...'); }); redis.psubscribe('*', function (err, count) {}); redis.on('pmessage', function (subscrbed, channel, message) { message = JSON.parse(message); client.publish('test', message, {qos: 0, retain: true});//监听到redis消息后,往通道 test 中发送消息 }); client.subscribe('test', {qos: 1});//订阅主题为test的消息 client.on('message', function (top, message) { console.log('client2.message:', message); });
使用
node app.js
执行该服务或使用 pm2 方式
- Laravel 中在需要执行的地方使用
event()
也可以在输入event(new TestEvent("content", "channel_1"));
php artisan tinker
进入tinker
后,输入event(new App\Events\TestEvent("content", "channel_1"));
- Laravel 中在需要执行的地方使用
初步接触 mqtt ,phpmqtt 碰壁较多,改用 nodejs 版 mqtt ,方便许多,记录一下。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: