cydrickn/swoole-websocket-bundle

Swoole Websocket for Symfony

v1.0.0 2022-09-30 17:04 UTC

This package is auto-updated.

Last update: 2024-08-29 05:44:37 UTC


README

使用swoole的WebSocket包

需求

安装

添加包

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运行时提供服务,您也可以这样做。

  1. 首先需要包含symfony/runtime
    composer require symfony/runtime
  2. 然后使用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_OPTIONSbasePath 应该是您的项目文件夹

$_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);
   }
}

相关包