开发实时通讯时使用 GatewayWorker 你们是怎么和 mvc 框架结合的?

官网推荐方式:www.workerman.net/doc/gateway-work...

现有mvc框架项目与 GatewayWorker 独立部署互不干扰
所有的业务逻辑都由网站页面 post/get 到 mvc 框架中完成
GatewayWorker 不接受客户端发来的数据,即 GatewayWorker 不处理任何业务逻辑,GatewayWorker 仅仅当做一个单向的推送通道
仅当mvc框架需要向浏览器主动推送数据时才在 mvc 框架中调用 Gateway 的API GatewayClient完成推送。

如果按照这种方案结合,客户端在发送消息时,其实就是在发送的一个 post/get 请求,是否会对发送效率啥的有影响?

大佬们是怎么结合的呢?

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 23

我们当时是用来做消息通知,前端不会有消息发到后台 就用了这个模式,如果是im类的话感觉中间要经过一层mvc的调用 会慢了一点

3年前 评论
Su (楼主) 3年前

我用的这个扩展包 smileymrking/laravel-gateway-worker

仅当 mvc 框架需要向浏览器主动推送数据时才在 mvc 框架中调用 Gateway 的 API GatewayClient 完成推送。

这里是说你的应用程序用GatewayClient提供的API,发送数据给GatewayWorker,具体发送消息到客户端还是GatewayWorker推送消息到客户端吧

3年前 评论
Su (楼主) 3年前
Su (楼主) 3年前
aba66 3年前

用户发送消息走 api,效率影响不大,发送消息可能会做频率、敏感词过滤,走其他渠道(比如:socket)反而更麻烦

3年前 评论

聊天对消息的实时性要求并不高,2,3秒之内能到就行了

3年前 评论

之前弄过类似的,客户端发消息走api,服务器接收到消息之后push 到消息队列 然后消息队列 通过websocket推送出去博客:基于 Hyperf 实现 RabbitMQ + WebSocket 消息推送

3年前 评论
Su (楼主) 3年前
ccflow (作者) 3年前
jcc123

games-jumpjump-prod.k8sv2.wpjs.cc/...

做游戏的话可以直接走GatewayWorker,这样效率会很高

file

这里games-prod.k8sv2.wpjs.cc/ 做了几个小游戏

3年前 评论
Su (楼主) 3年前
Su (楼主) 2年前

直接封装成一个command,命令行启动运行

可以参考我们开发的客服系统 modstart.com/m/LiveChat

3年前 评论

官方有一个包直接用就行了: 实现代码也发给你!
workerman/gatewayclient

<?php
// +----------------------------------------------------------------------
// | Name (Send.php) 消息发送类
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2019 http://phpIm.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | last modify: 2019/7/18
// +----------------------------------------------------------------------
// | Author: 毛豆<8101887@qq.com>
// +----------------------------------------------------------------------

    namespace App\Core\Chat\Im\Workerman;

    use App\Core\Chat\Im\ImInterface;
    use App\Core\Chat\Models\FriendModel;
    use App\Services\Service;
    use GatewayClient\Gateway;

    class SendService extends Service implements ImInterface
    {
        /**
         *  instance名称
         * @var array SendService instances
         */
        protected static $instances = null;

        /**
         * 连接workerman服务器
         * SendService constructor.
         */
        public function __construct()
        {
            Gateway::$registerAddress = '127.0.0.1:' . config('chat.text_port', 6002);
            parent::__construct(new FriendModel());
        }

        /**
         * 初使化instances
         * @return \App\Core\Chat\Im\Workerman\SendService|array|null
         */
        public static function &instance()
        {
            if (!isset (self::$instances)) {

                self::$instances = new SendService();
            }
            return self::$instances;
        }

        /**
         * 关闭时清空instances
         */
        public function __destruct()
        {
            self::$instances = null;
        }

        /**
         * 发送消息要求用户客户端下线
         * @param array $user
         */
        public function out($user = [])
        {
            $user = $user ?: getUser();
            $this->sendToUid($user->id, ['type' => 'out']);
        }

        /**
         * 通过用户id验证用户是否在线
         * @param int $uid
         * @return int
         */
        public function isOnline($uid = 0)
        {
            try {
                return Gateway::isUidOnline($uid);
            } catch (\Exception $exception) {
                return 0;
            }

        }

        /**
         * 验证客户端id是否在线
         * @param $client_id
         * @return int
         */
        public function isClientOnline($client_id)
        {
            return Gateway::isOnline($client_id);
        }

        /**
         * 向指定用户发送消息
         * @param $uid
         * @param $content
         * @return true
         */
        public function sendToUid($uid, $content)
        {
            try {
                Gateway::sendToUid($uid, is_array($content) ? json_encode($content) : $content);
                return true;
            } catch (\Exception $exception) {
                return false;
            }
        }

        /**
         * 客户端id与用户id邦定
         * @param $client_id
         * @param $uid
         * @return true
         */
        public function bindUid($client_id, $uid)
        {
            Gateway::bindUid($client_id, $uid);
            return true;
        }

        /**
         * 向所有客户端发送消息
         * @param array|string $content 发送内容
         * @param int $client_id 排除客户端
         * @throws \Exception
         */
        public function sendToAll($content = [], $client_id = 0)
        {
            Gateway::sendToAll(is_array($content) ? json_encode($content) : $content, '', $client_id);
        }

        /**
         * 获取用户所有在线的客户端client_id
         * @param $uid
         * @return array
         */
        public function getClientIdByUid($uid)
        {
            return Gateway::getClientIdByUid($uid);
        }

        /**
         * 返回客户端id邦定的uid
         * @param $client_id
         * @return mixed
         */
        public function getUidByClientId($client_id)
        {
            return Gateway::getUidByClientId($client_id);
        }

        /**
         * 获取当前所有在线的用户uid
         * @return array
         */
        public function getAllUidList()
        {
            return Gateway::getAllUidList();
        }

        /**
         * 获取所有在线客户端套连接与对应uid
         * @return array
         */
        public function getAllClientList()
        {
            return Gateway::getAllClientIdList();
        }

        /**
         * 批量验证指定用户组是否在线
         * 返回在线与不在用的的新数组
         * @param array $ids
         * @return array
         */
        public function checkOnlineUidAll($ids = [])
        {
            $resData = ['online' => [], 'offline' => []];
            foreach ($ids as $id) {
                if ($this->isOnline($id)) $resData['online'][] = $id; else  $resData['offline'][] = $id;
            }
            return $resData;
        }

    }
3年前 评论
zhanghaidi

workman不走mvc嘛?

2年前 评论

我觉得应该是分别独立部署,把消息推送做成服务的形式,相互不影响,GatewayWorker专门做消息推送或者是数据处理。相互之间使用api接口去通信。
也可以看看hyperf,集成了swoole,可以做socket、web_server等,它的使用习惯和laravel很像,通信就使用hyperf,其他对外使用laravel做api接口。

2年前 评论
Su (楼主) 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!