用例1:
步骤
- 在laravel项目的同一个容器中安装软件包
- 在
.env
和boradcasting.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
来使用包。 - 通过从修补程序会话调度
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');
}
}
用例二:
步骤
- 在laravel项目的同一个容器中安装软件包
- 在
.env
中配置推送器设置,如下所示:
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
后, Jmeter 板中的图形不显示。
注意:通过在config/websockets.php
中设置'perform_dns_lookup' => true
可以修复此问题。
- Jmeter 板中没有指示包广播事件的跟踪。
- 此外,在 Jmeter 板中使用事件创建器时,我在控制台中得到422状态码
- 许多开发人员在使用docker环境时遇到了同样的问题,但有些用例适用于其中一个,但不适用于其他人
最后,有什么解决办法吗?我被困了3天
2条答案
按热度按时间h6my8fg21#
也许可以尝试编辑.env文件以使用
host.docker.internal
,如下所示运行
php artisan config:cache
之后m3eecexj2#
好日子,我得到了一个运行在Docker构建上的WebSocket服务器,通过使用Laravel Echo镜像来构建我的Docker,然后设置我的应用程序和门户(第二个应用程序)与socket服务器进行身份验证,我可以发送消息,反之亦然。这是Laravel echo docker镜像,我用来构建我的docker堆栈https://github.com/oanhnn/docker-laravel-echo-server
我不认为使用artisan websockets:serve会起作用,因为你在容器中运行套接字,需要为它公开一个端口。好吧,至少我不能让它以这种方式工作,所以我用laravel echo做了。