在Docker环境中使用Laravel WebSockets包

16

用例1:

步骤

  • 在 Laravel 项目的同一容器中安装软件包。
  • 像这样在 .envbroadcasting.php 中配置推送设置:
PUSHER_APP_ID=123456789
PUSHER_APP_KEY=AZERTYUIOP
PUSHER_APP_SECRET=QSDFGHJKLMWXCVBN
PUSHER_APP_CLUSTER=mt1
PUSHER_APP_HOST=localhost # or 127.0.0.1
'pusher' => [
            'driver' => 'pusher',
            'key' => env('PUSHER_APP_KEY'),
            'secret' => env('PUSHER_APP_SECRET'),
            'app_id' => env('PUSHER_APP_ID'),
            'options' => [
                'cluster' => env('PUSHER_APP_CLUSTER'),
                // 'encrypted' => false,
                'host' => env('PUSHER_APP_HOST'),
                'port' => 6001,
                'scheme' => 'http',
            ],
        ],
  • 在项目容器的 Dockerfile 中暴露端口6001
  • 通过在容器内运行 php artisan websockets:serve 命令来使用该软件包。
  • 通过从tinker会话中调度 WebSocketsTestEvent 事件来测试该软件包。
class WebSocketsTestEvent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    protected $message;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct($message)
    {
        $this->message = $message;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('test');
    }
}

使用案例 2:

步骤

  • 在 Laravel 项目的同一容器中安装该软件包。
  • .env文件中配置 Pusher 设置,如下所示:
PUSHER_APP_ID=123456789
PUSHER_APP_KEY=AZERTYUIOP
PUSHER_APP_SECRET=QSDFGHJKLMWXCVBN
PUSHER_APP_CLUSTER=mt1
PUSHER_APP_HOST=ssms-app # or the @IP of the conatiner
  • 创建一个用于 websockets 容器的 Dockerfile,如下所示:
FROM php:7.3.3-alpine

RUN apk add --no-cache \
    wget \
    curl \
    # git \
    shadow \
    build-base \
    autoconf \
    # hiredis \
    libxml2-dev \
    zlib-dev \
    libevent \
    libevent-dev \
    openssl-dev \
    gmp-dev \
    icu-dev

RUN docker-php-ext-install \
        pcntl \
        mbstring \
        pdo \
        pdo_mysql \
        tokenizer \
        xml \
        sockets \
        gmp \
        bcmath \
        intl

        # Libevent
RUN pecl install event

RUN apk update

# Cleanup
# apk del .build-deps && \
RUN rm -rf /var/cache/apk/* && \
    rm -rf /tmp/*

RUN mkdir -p /var/www

RUN groupmod -g 1000 www-data && \
    usermod -u 1000 www-data

USER www-data

WORKDIR /var/www/html

EXPOSE 6001

CMD ["php", "artisan", "websockets:serve"]
  • 像这样配置docker-compose.yaml:

  ssms-app:
    build:
      context: ./docker/app
      args:
        uid: ${UID}
    container_name: ssms-app
    environment:
      - APACHE_RUN_USER=#${UID}
      - APACHE_RUN_GROUP=#${UID}
    volumes:
      - .:/var/www/html
    ports:
      - ${HOST_PORT}:80
      # - 6001:6001
    links:
      - ssms-redis
      - ssms-sockets
    networks:
      backend:
        aliases:
          - ssms-app

  ssms-sockets:
    build:
      context: ./docker/websockets
    container_name: ssms-sockets
    volumes:
      - .:/var/www/html
    ports:
      - 6001:6001
    networks:
      backend:
        aliases:
          - ssms-sockets

观察结果:

  • 在两种情况下,我都遇到了同样的问题:

    • 在访问http://localhost:8080/laravel-websockets后,仪表板中的图形未显示。

      注意:通过在config/websockets.php中设置'perform_dns_lookup' => true来解决这个问题。

    • 没有迹象表明包中的事件被广播到仪表板。

    • 此外,在使用事件创建器从仪表板时,控制台会返回422状态码
    • 许多开发人员在使用docker环境时遇到了相同的问题,但有些用例适用于某些人,但对其他人不起作用

最后,有什么解决方法吗?我已经卡在这里3天了


关于事件创建器,我正在使用频道:home,事件:App\Events\NewMessage,以及JSON格式的消息:{ "message": "Hello World" }。在这里对我来说它是有效的,同时我正在使用Channel而不是PrivateChannel - Luis Fernando Richter
你最终解决了这个问题吗?我也遇到了同样的情况,但是我不知道为什么无法从任何地方连接到 WebSocket。 - Flobbo
@Flobbo 实际上我还没有想出来,但问题已经得到解决,目前还没有答案! - joe_inz
抱歉,我已经很长时间没有参与这个项目了。 - joe_inz
哦,天哪,我已经为此奋斗了三天了,结果:没有。 - smidkristian
显示剩余2条评论
2个回答

1

也许尝试编辑 .env 文件,使用 host.docker.internal,像这样:

PUSHER_APP_ID=123456789
PUSHER_APP_KEY=AZERTYUIOP
PUSHER_APP_SECRET=QSDFGHJKLMWXCVBN
PUSHER_APP_CLUSTER=mt1
PUSHER_APP_HOST=host.docker.internal

在运行完之后,执行 php artisan config:cache

0

好的,我在Docker中使用Laravel Echo镜像来构建我的docker,并设置我的应用程序和门户网站(第二个应用程序)与套接字服务器进行身份验证,我可以相互发送消息。这是我用来构建docker堆栈的Laravel Echo Docker镜像https://github.com/oanhnn/docker-laravel-echo-server

我认为使用Artisan Websockets:serve不起作用,因为您正在容器中运行套接字,并且需要公开端口。至少我无法以这种方式使其工作,因此我使用laravel echo实现了它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接