接到產品需求單 ,哎說多都是累 這幾天接口寫個沒停🤚 今天搗鼓一下這個需求
需求簡要說明:客戶找我們做的pc端可視化大屏 需要掃碼 到 h5端移動端控制pc端大屏 移動端當然也是一個網頁 一對一操控 分n個大屏 於是我快速梳理了一下需求 將結果完成之后做一個小小的總結:上圖
整個流程用到的技術 前端 、websocket、redis 、workerman(原因使用方便 不限環境)
項目是前后端分離的 將邏輯梳理清楚后 工作量也就不大了 前后端對半開
下載 workerman 官網文檔
//composer 安裝
composer require workerman/workerman
編寫推送的websocket文件
<?php
/**
* Created by PhpStorm
* User: pl
* Date: 2020/9/2
* Time: 10:46
*/
use Workerman\Worker;
require_once './Autoloader.php';
$worker = new Worker("websocket://0.0.0.0:2345");
//開啟的worker進程
$worker->count = 4;
//前端連接發送的消息數據
$worker->onMessage = function ($connection,$data){
$redis = new \Redis();
$redis->connect('127.0.0.1','6379');
$redis->select(2);
//前端發送過來的唯一值 綁定連接的id
$redis->set($connection->id,$data);
$connection->send('已連接服務');
};
$worker->onWorkerStart = function ($ws_worker) {
\Workerman\Timer::add(1,function () use($ws_worker){
foreach($ws_worker->connections as $connection) {
$redis = new \Redis();
$queue = "nan_ling_";
$redis->connect('127.0.0.1','6379');
$redis->select(2);
//獲取消費的隊列
$rpop_list = $redis->get($connection->id);
//消費路由數據
if(!$rpop_list){
}else{
$queue = $queue.$rpop_list;
$value = $redis->rPop($queue);
if(!is_null($value)){
//推送給前端
$connection->send($value);
}
}
}
});
};
//監聽斷開連接
$worker->onClose = function ($connection){
$redis = new \Redis();
$redis->connect('127.0.0.1','6379');
$redis->auth('');
$redis->select(2);
// 刪除連接的唯一值
$redis->del($connection->id);
echo "connection closed\n".$connection->id;
};
Worker::runAll();
二、h5更新路由接口
/**
* 將用戶信息寫入隊列
* @param Request $request
* @throws \think\Exception
*/
public function updateRoute(Request $request)
{
$db = new Redis();
//掃碼獲取的唯一值
$client_sn = $request->header("issue");
if(!$client_sn) {
return $this->error([],'請重新掃碼',500);
}
$data = $request->put();
//組裝隊列名
$queue = self::$table.$client_sn;
//將點擊的路由放入隊列
$db->redis->rPush($queue,json_encode($data,JSON_UNESCAPED_UNICODE));
return $this->success([]);
}
執行文件
php h5_remote.php start