laravel 通过PHPSocket.io 与前端socket.io通信

目标:laravel后台通过command启动socket.io服务与前台连接推送消息

一、后台服务

    protected $signature = 'socket-message-server {action=status}';
    protected $description = 'WebSocket  server controller';

    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        // 指定文件路径
        @unlink(storage_path('socket-message-server.pid'));
        @unlink(storage_path('socket-message-server.log'));
        Worker::$pidFile = storage_path('socket-message-server.pid');
        Worker::$logFile = storage_path('socket-message-server.log');

        $this->formatArgv();
        $io = new SocketIO(6010);

        $io->on('workerStart', function () use ($io) {
            Log::debug('socket-message-server start.');
            // 创建全局定时器
            $this->loopPushMessageDing($io);
        });

        $io->on('connection', function ($socket) use ($io) {
            // 连接事件回调  可在此增加业务验证逻辑和自定义事件
            // 自定义事件示例  auth
            $socket->on('auth', function(array $data) use ($socket){
                 // 自定义事件 业务逻辑
            });

            $socket->on('disconnect', function () use ($socket) {
                 // 处理断开连接事件代码
            });

        });

        Worker::runAll();
    }

protected function loopPushMessageDing(SocketIO $io): void
{
  // 设置全局定时器
  Timer::add(5, function () use ($io) {
      // 业务逻辑
  }
}

二、docker配置

// docker-compose.yml
socket_message:
    build:
      context: ./docker
      dockerfile: Dockerfile-socket-message
    restart: always
    depends_on:
      - app
    ports:
      - "${APP_IP}:${APP_SOCKET_PORT}:6010"
    volumes:
      - ./:/srv/app


// Dockerfile-socket-message

FROM image

EXPOSE 6010

ENTRYPOINT ["php", "artisan", "socket-message-server", "start"]

三、Nginx配置

upstream server-message {
  server 172.17.0.1:8888;

location server-message {
  proxy_pass http://server-message;
  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "upgrade";
  proxy_set_header X-Forwarded-For $remote_addr;
}

四、前端连接示例

async connect() {
   let res = await getData('通过后台接口区分线上线下ip,方便调试');
   let notifyUrl = res.notify_url;
   const notifyWs = io(notifyUrl, {
                    path: `server-print`,
                    transports: ['websocket'] // 不设置可能轮询建立连接
                });
   let _this = this;
                // 处理连接事件
   notifyWs.on('connect', function () {
      notifyWs.emit('auth', {
      // auth参数传递
      });
      _this.onConnect();
  });
}

小结

一、回顾

1、此项目致力于优化之前的socket通知服务,所以没有过多创新,功能包和大体结构还是沿用之 前的设计。在原先的基础上增加了redis缓存,将消息推送逻辑重写的更加合理。并对功能进行拆分。
2、完成效果和刚接手原型时思考的有些许出入,实际业务并没有想象中的复杂和庞大,如此结构已经可以适用了。
3、学习到了docker的一些知识

二、小结

1、在此项目组了解了些许功能,虽然业务逻辑上不适用但是感觉很有意思,私下可以尝试下。如:phpsocket.io启动后开内部http端口通过phpsocket.io向客户端推送数据
还有文中没有写出来的一些子功能如:通过菜鸟打印组件自定义一维码,二维码模板,再通过ws通信本地菜鸟打印组件进行自定义面单打印
2、最近在学习深入剖析nginx这本书,下次希望能写一篇关于nginx的博文。
3、行情不好,还有老赖欠钱:rage:。 情绪有点混乱

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

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