一个基于 webman 的小聊天室 DEMO

王小大

认识 webman

我们公司项目一直使用的 Laravel,部分项目也可能会用到 laravels(swoole),所以我对于 workerman 的关注少之又少。我平时本来就比较习惯逛 LearnKu,也是在今年上半年看到了一篇关于介绍 webman 的帖子,这才知道 walkor 老大居然出了一个基于 workerman 的web框架,一下子就来了兴趣,各种翻论坛看相关帖子,哈哈(就喜欢研究新玩意儿😂)。但是由于工作方面原因,项目周期也比较紧,也就不了了之。直到上周来着,一时兴起,寻思写个小聊天室玩玩,说干就干...

初衷

一开始准备花一晚上,随便撸一个零样式的。后来...原本做后端的,对前端布局、CSS都不在行,折腾不少时间才基于 Bootstrap5 拼出来了下面的两个页面(见笑了🤭)。
效果图

数据以及问题

准备用 Mysql数据库 记录用户信息、以及聊天记录,然后聊天记录通过Redis存储再扫到数据库。但是我没想到更好的更新读取方案,暂时存的Redis没做同步方案。对于这块问题我产生的以下不完善想法:

  • 聊天默认写入Redis,通过定时任务扫入数据库。
    问题:当用户刷新页面后如果从数据库读取数据用于回显,如果首次通过数据库拿记录将不能实时获取最新的聊天记录。
  • 聊天记录写入读取都通过 Redis。
    问题:Redis 和数据库数据什么时候去同步。同时更想听听大家的方案。
  • 聊天记录回显目前是通过握手并验证成功后下发当前房间1小时内的聊天记录
    问题:下发的聊天记录是存储到 JS 的一个数组中的,然后通过 AplineJS for 遍历渲染出来的,如果一小时聊天记录几千上万条浏览器肯定会卡,想听听大家的优化方案。

项目地址

https://github.com/getda/Liao

2754 4 1
4个评论

as5739

很棒,学习了!

  • 暂无评论
深蓝

学习下,很棒的demo.

  • 暂无评论
onwnic

Fatal error: Uncaught Error: Call to undefined function envs() in G:\xxx\Liao-main\config\app.php:18
envs 函数在哪里定义

软饭工程师

我在参考老大的代码,使用workerman 起一个进程对聊天服务做压测时出现报错,下面是代码

<?php
require __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;
use Workerman\Lib\Timer;
use Workerman\Connection\AsyncTcpConnection;

$worker = new Worker();
$worker->onWorkerStart = 'connect';
function connect(){
    static $count = 0;
    // 2000个链接
    if ($count++ >= 500) return;
    // 建立异步链接
    $con = new AsyncTcpConnection('ws://127.0.0.1:8282');
    $con->onConnect = function($con) {
        $con->send('hello world');

        // 递归调用connect
        connect();
    };
    $con->onMessage = function($con, $msg) {
        echo "recv $msg\n";
    };
    $con->onClose = function($con) {
        echo "con close\n";
    };
    // 当前链接每55秒发个心跳包
    Timer::add(55, function()use($con){
        $con->send("ping");
    });
    $con->connect();
    echo $count, " connections complete\n";
}
Worker::runAll();

报错内容

ErrorException: strlen(): Passing null to parameter #1 ($string) of type string is deprecated in /Users/aaa/www/Liao/vendor/workerman/gateway-worker/src/Protocols/GatewayProtocol.php:179

Stack trace:
#0 [internal function]: {closure}(8192, 'strlen(): Passi...', '/Users/aaa/ww...', 179)
#1 /Users/aaa/www/Liao/vendor/workerman/gateway-worker/src/Protocols/GatewayProtocol.php(179): strlen(NULL)
#2 /Users/aaa/www/Liao/vendor/workerman/gateway-worker/src/Lib/Gateway.php(714): GatewayWorker\Protocols\GatewayProtocol::encode(Array)
#3 /Users/aaa/www/Liao/vendor/workerman/gateway-worker/src/Lib/Gateway.php(394): GatewayWorker\Lib\Gateway::getBufferFromAllGateway(Array)
#4 /Users/aaa/www/Liao/plugin/webman/gateway/Events.php(26): GatewayWorker\Lib\Gateway::getClientIdByUid(NULL)
#5 [internal function]: plugin\webman\gateway\Events::onWebSocketConnect('7f0000010900000...', Array)
#6 /Users/aaa/www/Liao/vendor/workerman/gateway-worker/src/BusinessWorker.php(419): call_user_func('plugin\\webman\\g...', '7f0000010900000...', Array)
#7 /Users/aaa/www/Liao/vendor/workerman/workerman/Connection/TcpConnection.php(638): GatewayWorker\BusinessWorker->onGatewayMessage(Object(Workerman\Connection\AsyncTcpConnection), Array)
#8 /Users/aaa/www/Liao/vendor/workerman/workerman/Events/Select.php(295): Workerman\Connection\TcpConnection->baseRead(Resource id #235)
#9 /Users/aaa/www/Liao/vendor/workerman/workerman/Worker.php(2465): Workerman\Events\Select->loop()
#10 /Users/aaa/www/Liao/vendor/workerman/workerman/Worker.php(1574): Workerman\Worker->run()
#11 /Users/aaa/www/Liao/vendor/workerman/workerman/Worker.php(1416): Workerman\Worker::forkOneWorkerForLinux(Object(Workerman\Worker))
#12 /Users/aaa/www/Liao/vendor/workerman/workerman/Worker.php(1390): Workerman\Worker::forkWorkersForLinux()
#13 /Users/aaa/www/Liao/vendor/workerman/workerman/Worker.php(1722): Workerman\Worker::forkWorkers()
#14 /Users/aaa/www/Liao/vendor/workerman/workerman/Worker.php(1660): Workerman\Worker::monitorWorkersForLinux()
#15 /Users/aaa/www/Liao/vendor/workerman/workerman/Worker.php(559): Workerman\Worker::monitorWorkers()
#16 /Users/aaa/www/Liao/start.php(117): Workerman\Worker::runAll()
#17 {main}
SendBufferToWorker fail. The connections between Gateway and BusinessWorker are not ready. See http://doc2.workerman.net/send-buffer-to-worker-fail.html

没找到报错原因在哪
这个报错提示解决方案:http://doc2.workerman.net/send-buffer-to-worker-fail.html

王小大

290
积分
0
获赞数
0
粉丝数
2022-02-19 加入
🔝