前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP实现TCP实例

PHP实现TCP实例

作者头像
OwenZhang
发布2021-12-08 14:48:37
8870
发布2021-12-08 14:48:37
举报
文章被收录于专栏:Owen's World

NotifyService.php

代码语言:javascript
复制
class NotifyService extends Model
{
    private static $client;
    private static $redis;

    /**
     * 初始化
     */
    protected static function initial()
    {
        $url          = 'tcp://' . config('ctrl_service.host') . ':' . config('ctrl_service.port');
        self::$client = @stream_socket_client($url, $errno, $errmsg, 1);

        if (!self::$client) {
            return false;
        }
        return true;
    }
/**
     * redis连接
     * 接口并发量较高的时候容易造成TIMEWAIT过多
     * 尽量避免多次进行连接
     */
    private static function redisConnect()
    {
        // 判断是否使用redis 做缓存 如果有连接过
        // if (config('cache.type') == 'redis') {

        //     // redis 连接 判断是否有已经连接过
        //     $cache = Cache::init();
        //     // 获取缓存对象句柄
        //     $handler     = $cache->handler();
        //     self::$redis = $handler;
        //     return;
        // }

        self::$redis = new Redis();
        $host        = Env::get('redis.host', '127.0.0.1'); // redis 主机ip
        $port        = Env::get('redis.port', 6379); // redis 端口
        $password    = Env::get('redis.password', '123456'); // redis 密码
        $select      = Env::get('cache.select', 0); // 数据库
        // 第一个参数为redis服务器的ip,第二个为端口
        // self::$redis->connect($host, $port);
        self::$redis->pconnect($host, $port);
        self::$redis->auth($password); //密码验证
        self::$redis->select($select); //选择数据库
    }

    /**
     * redis断开
     */
    public static function redisClose()
    {
        self::$redis->close();
    }


/**
     * app 通知
     */
    public static function appNotify($content, $uid = 0)
    {
        if (!self::initial()) {
            return false;
        }

        $post_data = [
            'cmd'       => 1010,
            'type'      => 'notice',
            'uid'       => (int) $uid,
            'msgid'     => 88, // 88是于客户端约定的标识
            'content'   => json_encode($content),
            'loopcount' => 1,
            'gid'       => 0,
            'roomno'    => 0,
            'interval'  => 1,
        ];
        return self::sendMsg($post_data);
    }

/**
     * 发送消息给控制服转发到游服
     */
    public static function sendMsg($data)
    {
        // 添加一层外壳转发
        $msg = [
            'content' => $data,
            'type'    => 'forwarding',
        ];
        $msg = json_encode($msg);
        $msg .= "\n";
        return fwrite(self::$client, $msg);
    }

/**
     * 通知中间件配置相关
     */
    public static function middleNoticeConfigInit($data, $redis_subscribe = 'middle_config')
    {
        self::redisConnect();
        $data = json_encode($data);
        $res  = self::$redis->publish($redis_subscribe, $data);
        self::redisClose();
    }
}
复制代码
NotifyService::appNotify(['type' => 'other_close'], $uid);

// 通知中间件重新获取配置

NotifyService::middleNoticeConfigInit(['type' => 'init_robot_uids']);

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021年10月25日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档