Thinkphp 使用Workerman 聊天室
2023-03-29 23:03:03
373
{{single.collect_count}}

1、下载Workerman插件

composer require topthink/think-worker

2、示例代码 后端

     2.1 下载之后会得到这俩个文件 

2.2 这个文件对应上面的worker_class 的地址 

   2.3.worker.php示例代码

<?phpnamespace app\http;use think\facade\Db;use think\worker\Server;use Workerman\Lib\Timer;use app\model\IndexModel;/** * websockect * Class Worker * @package app\http */class Worker extends Server{protected $socket = 'http://0.0.0.0:2348';/** * 心跳检测 * @var int */protected static $heartbeat_time= 55;public function onConnect($connection){var_dump('connect success');$connection->send(json_encode('connect success'));}## 接收消息,接收心跳消息 ,接收用户id 信息等等public function onMessage($connection,$data){$connection->lastMessageTime = time();#var_dump($data);$connection->send(json_encode('receive success'));}/** * 消息回调 * @param $worker * @author 冬 * @date 2022/5/5 17:07 */public function onWorkerStart($worker){//查看是否有新的下面的3是几秒推送一次Timer::add(3, function () use ($worker) {$time_now = time();var_dump(date('Y-m-d H:i:s',$time_now) );## 推送的数据$infoObj =IndexModel::getTips();$infoArr = json_decode(json_encode($infoObj),true);if (true) {foreach ($worker->connections as $connection) {if (empty($connection->lastMessageTime)) {$connection->lastMessageTime = $time_now;}var_dump(date('Y-m-d H:i:s',$connection->lastMessageTime) );if ($time_now - $connection->lastMessageTime > self::$heartbeat_time) {$connection->close();}$connection->send(json_encode($infoArr));}} else {var_dump(22);foreach ($worker->connections as $connection) {if (empty($connection->lastMessageTime)) {$connection->lastMessageTime = $time_now;continue;}if ($time_now - $connection->lastMessageTime > self::$heartbeat_time) {//连接超时$connection->close();}}}});}public function onClose($connection){var_dump('close');}}

     2.4 前端示例代码

<script>let ws = new WebSocket("ws://127.0.0.1:2348") ws.onopen = function() {//绑定连接事件console.log("连接成功");//每30秒发送一次心跳setInterval(function(){ws.send(JSON.stringify({'type':"peng"}));console.log('发送心跳...'); },30000) }; ws.onmessage = function(evt) {//绑定收到消息事件data = JSON.parse(evt.data)console.log(data);//这里处理收到的消息, type类型有两种: connectin、deposit如果有deposit要提示 };ws.onclose = function(evt) { //绑定关闭或断开连接事件  console.log("连接已关闭");};</script>

3、开启服务 php think worker:server

4、打开前端页面查看是否链接成功

回帖
全部回帖({{commentCount}})
{{item.user.nickname}} {{item.user.group_title}} {{item.friend_time}}
{{item.content}}
{{item.comment_content_show ? '取消' : '回复'}} 删除
回帖
{{reply.user.nickname}} {{reply.user.group_title}} {{reply.friend_time}}
{{reply.content}}
{{reply.comment_content_show ? '取消' : '回复'}} 删除
回帖
收起
没有更多啦~
{{commentLoading ? '加载中...' : '查看更多评论'}}