Websocket与Workerman


GatewayWorker

GatewayWorker基于Workerman开发的一个项目框架,用于快速开发TCP长连接应用,例如app推送服务端、即时IM服务端、游戏服务端、物联网、智能家居等等

用GatewayWorker还是Workerman

1、如果你的项目是长连接并且需要客户端与客户端之间通讯,建议使用GatewayWorker。
2、短连接或者不需要客户端与客户端之间通讯的项目建议使用Workerman。
3、GatewayWorker不支持UDP监听,所以UDP服务请选择Workerman。
如果你是一个有多进程socket编程经验的人,喜欢定制自己的进程模型,可以选择Workerman。

同步异步以及阻塞和非阻塞的区别

1、同步阻塞:小明啥都不干等奶茶。
2、同步非阻塞:小明一边玩手机一边等奶茶。
3、异步阻塞:小明拿着小票啥都不干等着奶茶妹告诉他奶茶好了
4、异步非阻塞:小明拿着小票玩着手机等着奶茶妹告诉他奶茶好了

业务需求示例:系统后台监听有新的商品订单,新消息等的通知,推送给所有登陆系统的用户。

安装workerman组件

composer require topthink/think-worker=2.0.8

配置 config/worker_server.php

'protocol'       => 'websocket', // 协议 支持 tcp udp unix http websocket text
    'host'           => '0.0.0.0', // 监听地址
    'port'           => 2345, // 监听端口
    'socket'         => '', // 完整监听地址
    'context'        => [], // socket 上下文选项
    'worker_class'   => 'app\index\controller\Worker', // 自定义Workerman服务类名 支持数组定义多个服务

实现 app\index\controller\Worker.php

<?php
namespace app\index\controller;

use think\worker\Server;
use Workerman\Lib\Timer;
/**
 * websockect
 * Class Worker
 * @package app\http
 */
class Worker extends Server
{
    protected $socket = 'http://0.0.0.0:1111';
    /**
     * 心跳检测
     * @var int
     */
    protected static $heartbeat_time    =   55;

    ## 接收消息,接收心跳消息 ,接收用户id 信息等等
    public function onMessage($connection,$data)
    {
        $connection->lastMessageTime = time();
        var_dump($data);
        $connection->send('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) );
            ## 推送的数据
            $infoArr = '推送的数据';

//            $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();
                    }
                }
            }
        });
    }

}

实现 websokcet

<script>
    let ws = new WebSocket("ws://192.168.118.133:1111")
    ws.onopen = function() {  //绑定连接事件
        console.log("连接成功");
        //每30秒发送一次心跳,保持连接
        setInterval(function(){
            ws.send('123');
            console.log('发送心跳...');
        },30000)
    };
    ws.onmessage = function (s){
        console.log(s.data);
    }
    ws.onclose = function(evt) { //绑定关闭或断开连接事件
        console.log("连接已关闭");
    };
</script>

操作

//支持reload|restart|stop|status 操作
//-d 守护进程
php think worker:server -d

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值