cydrickn / swoole-websocket-bundle
Swoole Websocket for Symfony
v1.0.0
2022-09-30 17:04 UTC
Requires
- php: ^8.1
- symfony/console: ^6.1
- symfony/framework-bundle: ^6.1
Requires (Dev)
- openswoole/ide-helper: ^4.11
Suggests
- symfony/runtime: When you plan to use this bundle with runtime
README
使用swoole的WebSocket包
需求
- Swoole 或 OpenSwoole
- PHP >= 8.1
- Symfony >= 6.1
安装
添加包
composer require cydrickn/swoole-websocket-bundle
运行服务器
php ./bin/console websocket:server
命令
websocket:server
运行WebSocket服务器
事件
此包将有一个事件,您可以通过它来监听
\Cydrickn\SwooleWebsocketBundle\Event\OpenEvent
此事件将在客户端连接到服务器时触发。
\Cydrickn\SwooleWebsocketBundle\Event\MessageEvent
此事件将在客户端发送消息时触发。
\Cydrickn\SwooleWebsocketBundle\Event\CloseEvent
此事件将在客户端断开连接时触发。
使用JavaScript连接客户端
对于连接WebSocket的基本方式,您可以使用浏览器WebSocket。
const socket = new WebSocket('ws://localhost:8080'); // Connection opened socket.addEventListener('open', (event) => { socket.send('Hello Server!'); }); // Listen for messages socket.addEventListener('message', (event) => { console.log('Message from server ', event.data); });
在运行时使用它
使用命令是可以的,但如果您想使用symfony运行时提供服务,您也可以这样做。
- 首先需要包含symfony/runtime
composer require symfony/runtime
- 然后使用env APP_RUNTIME运行您的
public/index.php
APP_RUNTIME=\\Cydrickn\\SwooleWebsocketBundle\\Runtime\\Runtime php ./public/index.php
运行时配置
对于运行时配置,您可以将它添加到您的 public/index.php
示例:
#!/usr/bin/env php <?php use App\Kernel; $_SERVER['APP_RUNTIME_OPTIONS'] = [ 'host' => '0.0.0.0', 'port' => 8000, 'mode' => SWOOLE_PROCESS, 'settings' => [ \Swoole\Constant::OPTION_WORKER_NUM => swoole_cpu_num() * 2, \Swoole\Constant::OPTION_ENABLE_STATIC_HANDLER => true, \Swoole\Constant::OPTION_DOCUMENT_ROOT => dirname(__DIR__).'/public' ], ]; require_once dirname(__DIR__).'/vendor/autoload_runtime.php'; return function (array $context) { return new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']); };
此外,您不需要为WebSocket和HTTP提供服务,只需启用
Serve HTTP
,将serve_http
设置为true即可
热重载
我们已经为此包包含了热重载。要启用它,您首先需要引入 cydrickn/php-watcher
热重载仅在您使用运行时时可用
composer require cydrickn/php-watcher
现在将 hotReload
添加到您的 APP_RUNTIME_OPTIONS
,basePath
应该是您的项目文件夹
$_SERVER['APP_RUNTIME_OPTIONS'] = [ 'host' => '0.0.0.0', 'port' => 8000, 'mode' => SWOOLE_PROCESS, 'hotReload'=> [ 'enabled' => true, 'basePath' => dirname(__DIR__), ], 'settings' => [ \Swoole\Constant::OPTION_WORKER_NUM => swoole_cpu_num() * 2, \Swoole\Constant::OPTION_ENABLE_STATIC_HANDLER => true, ], ];
Socket IO
在此包中,您还可以启用使用socket.io实现,要启用它,首先需要安装 cydrickn/socketio
此实现仅在您使用运行时时可用
composer require cydrickn/socketio
现在将 socketio
设置为 true
添加到您的 APP_RUNTIME_OPTIONS
$_SERVER['APP_RUNTIME_OPTIONS'] = [ 'socketio' => true, 'host' => '0.0.0.0', 'port' => 8000, 'mode' => SWOOLE_PROCESS, 'settings' => [ \Swoole\Constant::OPTION_WORKER_NUM => swoole_cpu_num() * 2, \Swoole\Constant::OPTION_ENABLE_STATIC_HANDLER => true, ], ];
为socket io添加路由
对于纯socket io,您将这样做
$server->on('connection', function (\Cydrickn\SocketIO\Socket $socket) { $socket->emit('hello', 'world'); }); $server->on('chat', function (\Cydrickn\SocketIO\Socket $socket, $message) { $socket->broadcast()->emit('chat', $message); });
您将使用此包的属性路由 Cydrickn\SwooleWebsocketBundle\Attribute\RouteAttribute
在您的任何服务中
<?php namespace App\Controller; use Cydrickn\SwooleWebsocketBundle\Attribute\RouteAttribute; class SocketController { #[RouteAttribute(path: 'connection')] public function connection(\Cydrickn\SocketIO\Socket $socket) { $socket->emit('hello', 'world'); } #[RouteAttribute(path: 'chat')] public function anotherMethod(\Cydrickn\SocketIO\Socket $socket, $message) { $socket->broadcast()->emit('chat', $message); } }