当前位置: 首页 > article >正文

php+微信小程序 websocket

一、需求背景

根据需求小程序有个页面需要实时刷新数据,前端轮询太费性能,所以采用websocket。

小程序只允许xss协议,因为要https的嘛。websocket协议就是ws,https的就是wss。

二、小程序文档

wx.sendSocketMessage(Object object) | 微信开放文档

 

/(ㄒoㄒ)/~~用错了后台接收不到数据。

三、workerman

php使用tp5.0框架,原项目就是这个版本……文档里有websocket相关的。

Workerman · ThinkPHP5.0完全开发手册 · 看云

查看composer库选下版本,毕竟太老了。一般文档里有要composer安装版本的要求,最好都看下版本。

topthink/think-worker - Packagist

2.0就要求php5.1的……只能用1.0,所以命令行如下:

composer require topthink/think-worker=1.0.*
#win10 
composer require workerman/workerman-for-win

安装报错解决:

# composer版本错误 改到指定版本
composer self-update 2.1.6
# 报错 提示--no-plugin 
composer update --no-plugin


tp文档里有说明写法,不再赘述。

四、信息推送

普通信息推送直接$conn->send("str")就可以。

但这个需求里我想隔断时间就推送信息,就在onMessage()里直接用while,然后多个客户端会卡死……

后来查教程:Thinkphp5.0 安装使用Workerman实现websocket前后端通信,后端主动推送消息到前端_QQ4770851的博客-CSDN博客z

中心思想就是 在onWorkerStart()里处理,说实话我也刚学swoole,这个workerman是首次使用。

大佬们给的建议就是Timer类。

 public function onMessage($connection, $data)
    {
        $connection->send('我收到你的信息了');

        $authData = json_decode($data, true);
        $uid = $authData['uid'];
        if (!isset($connlist[$uid])) {
            $this->connlist[$uid] = $connection;
        }
        $time = time();
        $time_interval = 2; //2s
        $timer_id = Timer::add($time_interval,
            function () use ($uid) {
                var_dump($uid);
                $newtime = time();
                if (empty($this->connlist[$uid]->lasttime)) {
                    $this->connlist[$uid]->lasttime = $newtime;
                    $lasttime = $newtime;
                } else {
                    $lasttime = $this->connlist[$uid]->lasttime;
                }
                $this->connlist[$uid]->send('testtest');
                if ($newtime - $lasttime >= 60) {
                    $this->connlist[$uid]->close();
                } else {
                    $this->connlist[$uid]->lasttime = $newtime;
                }
            }
        );
    }

 事实证明大佬是对的,解决了同步堵塞问题。

五、ws反代理

wss是ws的反代理,也有详细文档。创建wss服务-workerman手册

我用的nginx,apache2半天没弄出来。

配置的时候:

 ssl_session_cache shared:SSL:50m;

 这句报错,显示配置冲突。因为其网址也用相同的域名,而这个配置是公用的,所以要一致。改成一样的就好。


http://www.kler.cn/a/6613.html

相关文章:

  • BenchmarkSQL使用教程
  • 基于Python3编写的Golang程序多平台交叉编译自动化脚本
  • leecode494.目标和
  • 【Unity】【VR开发】实现VR屏幕共享应用的几个重要插件和参考资料分享
  • 并发控制之CyclicBarrier
  • 【我的 PWN 学习手札】IO_FILE 之 stdin任意地址写
  • C/C++每日一练(20230403)
  • 【数据库管理】⑥日志挖掘LogMiner
  • 图像镶嵌拼接
  • ToBeWritten之MIPS汇编基础铺垫
  • aspnet030高校学生团体管理系统sqlserver
  • 夜天之书 #80 推特开源算法与开放革命
  • RocketMQ消息ACK机制及消费进度管理
  • Linux——控制启动过程(更改root密码)
  • springcloud整合knike4j聚合微服务接口文档
  • 蓝桥杯 路径
  • 2.11 循环赛日程表
  • 编译与链接相关知识
  • 推荐一款强大的OCR工具
  • Golang电脑上怎么下载-Go安装和环境配置图文教程[超详细]
  • 联想服务器上安装 ffmpeg
  • 照片太大怎么压缩变小一点,分享5个简单方法
  • 组合预测 | Python实现LSTM-XGBoost长短期记忆网络组合极限梯度提升树股票价格预测
  • OJ系统刷题 第一篇
  • leetcode 152 乘积最大子数组
  • 无证驾驶叉车而导致人员死亡的事故!【安装叉车指纹锁、司机权限采集器的重要性】