werkraum / websocket-provider
在TYPO3环境中运行具有可扩展服务器逻辑的websocket服务器。
Requires
- ext-json: *
- ext-pcntl: *
- ext-posix: *
- cboden/ratchet: ^0.4.4
- typo3/cms-core: ^10.4
Requires (Dev)
- typo3/tailor: ^1.5
README
提供基本的设置,在TYPO3中运行Ratchet WebSocket服务器。
目前仅适用于*nix系统
composer req werkraum/websocket-provider
typo3cms websocket:start
路由和组件
组件
在您的扩展中实现Ratchet接口 Ratchet\MessageComponentInterface
。这将作为您的逻辑入口点。
class YourMessageComponent implements Ratchet\MessageComponentInterface { // interface methods with your logic go here }
将您的组件标记为公共,以便在内部使用Symfony依赖注入。用websocket.component
标记您的组件以将其注册到WebSocket提供者。
配置/Services.yaml
# default service setup goes here services: Vendor\Extension\WebSocket\YourMessageComponent: public: true tags: ['websocket.component']
路由
使用Symfony路由提供多租户。
您可以让您的组件实现接口CustomRouteInterface。返回带有前导斜杠的自定义路由路径(例如/socket.io/my_component
)。
Vendor\Extension\MyComponent
的默认路由为/Vendor_Extension_MyComponent
请注意,您的WebSocket路由可能由您为web服务器配置设置的任何内容进行前缀。在我的情况下,这通常是/socket.io。您可以在设置中设置此全局前缀。然后,该前缀将添加到每个组件路由之前,包括使用此扩展的第三方组件。
循环
如果需要周期性定时器或处理信号,可以实现接口ConfigureLoopInterface。您将作为参数获得循环。已经注册了SIGTERM和SIGINT信号来关闭服务器。
配置
有关所有配置选项,请参阅ext_conf_template.txt。
命令
演示
Ratchet提供了一个简单的echo组件。您可以通过Symfony DI注册它。
任何 配置/Services.yaml
Ratchet\Server\EchoServer: public: true tags: ['websocket.component']
安全
身份验证
当前的前端和后端用户会话作为UserAspects添加到连接中。同时添加连接的ID。
$conn->feUser $conn->beUser
当未进行身份验证时,不会拒绝连接。此外,仅在打开连接时检查身份验证。
速率限制
提供了一个基本的限制器,可在设置中进行配置。更复杂的速率限制可能需要由您的web服务器执行。
服务器配置
需要ext-json
、ext-pcntl
和ext-posix
来检查服务器状态的cli命令。
NGINX
Laravel有一些关于如何设置NGINX进行WebSocket的良好文档。
https://beyondco.de/docs/laravel-websockets/basic-usage/ssl#usage-with-a-reverse-proxy-like-nginx
DDEV
打开端口。通过DDEV配置web_extra_exposed_ports
或自定义docker-compose文件。
docker-compose.websockets.yaml
version: '3.6' services: web: ports: - "18080"
端口和URL部分/socket.io
可以根据您的需求进行调整。我建议将扩展设置route_prefix
设置为WebSocket配置中设置的URL部分。
以下是需要添加到web服务器配置中的代理传递配置。它使用自定义URL部分来区分WebSocket和常规HTTP请求。这很好地与现有的web服务器配置集成。Laravel文档有一个没有URL部分的Nginx设置。
请记住在Web服务器配置中删除
#ddev-generated
行,否则在DDEV重启后您的更改将被覆盖。
Apache
<Location "/socket.io">
LoadModule proxy_wstunnel_module /usr/lib/apache2/modules/mod_proxy_wstunnel.so
ProxyPass "ws://:18080/socket.io"
ProxyPassReverse "ws://:18080/socket.io"
ProxyPreserveHost On
RequestHeader set Upgrade "websocket"
RequestHeader set Connection "Upgrade"
</Location>
NGINX
location /socket.io {
proxy_pass https://:18080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
}