1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/immusen-yii2-swoole-websocket

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Websocket rpc server для Yii2 на основе Swoole 4

Websocket-сервер для Yii2, основанный на Swoole версии 4 и выше. Поддерживает JSON-RPC, разрешает «method» как маршрут, отражающий контроллер/действие, а также поддерживает HTTP или Redis pub/sub для запуска асинхронных задач из веб-приложения.

Установка

  1. Установите Yii2: Yii2.
  2. Установите Swoole: Swoole, рекомендуется версия 4+.
  3. Другие зависимости: расширение php-redis.
  4. Предпочтительный способ установки этого расширения — через composer.
  5. Либо запустите:
php composer.phar require --prefer-dist immusen/yii2-swoole-websocket "~1.0"
  1. Либо добавьте:
"immusen/yii2-swoole-websocket": "~1.0"

в раздел require вашего файла composer.json.

Тестирование или использование

После установки перейдите в корневой каталог проекта, например, cd yii2-advanced-project/ и выполните следующие действия:

  • Переместите файлы:
mv vendor/immusen/yii2-swoole-websocket/example/websocket ./
mv vendor/immusen/yii2-swoole-websocket/example/websocket-server ./
chmod a+x ./websocket-server
  • Запустите:
./websocket-server start    //start server
./websocket-server restart  //restart server
./websocket-server reload  //reload task worker
./websocket-server status  //server status
  • Настройте:
vim ./websocket/config/params.php

или напишите код в папке ./websocket/controllers/.

Пример: демонстрация чата, код: ./example/websocket/controllers/RoomController.php.

Клиент присоединяется к комнате: клиент websocket отправляет:

{
    "jsonrpc":"2.0",
    "id":1,
    "method":"room/join",
    "params":{
        "id":"100111",
        "info":{
            "age":"19",
            "gender":"f"
        }
    }
}

Веб-сокет-клиент, который присоединился к той же комнате (идентификатор: 100111), получит сообщение:

{
    "jsonrpc":"2.0",
    "id":1,
    "result":{
        "type":"join",
        "count":85,
        "info":{
            "age":"19",
            "gender":"f"
        }
    }
}

Сообщение чата: клиент websocket отправляет:

{
    "jsonrpc":"2.0",
    "id":1,
    "method":"room/msg",
    "params":{
        "id":"100111",
        "content":{
            "text":"Hello world!"
        }
    }
}

Участник этой комнаты получит:

{
    "jsonrpc":"2.0",
    "id":1,
    "result":{
        "text":"Hello world!"
    }
}

Кодирование

  1. Создайте контроллер в папке websocket/controllers или в другой папке, которая определена с помощью «controllerNamespace» в файле websocket/config/main.php:
<?php
namespace websocket\controllers;

use immusen\websocket\src\Controller;

class FooController extends Controller
{
 public function actionBar($param_1, $param_2 = 0, $param_n = null)
 {
      # добавить текущий fd в группу/набор, сделать $param_1 или любую другую строку в качестве ключа группы/набора
      $this->joinGroup($this->fd, $param_1);
      
      # отправить сообщение текущему клиенту через websocket
      $this->publish($this->fd, ['p1' => $param_1, 'p2' => $param_2]);
      
      # получить все fds, хранящиеся в группе/наборе
      $fds_array = $this->groupMembers($param_1);
      
      # отправить сообщение группе
      $this->publish($fds_array, ['p1' => $param_1, 'p2' => $param_2]);
      #или
      $this->sendToGroup(['p1' => $param_1, 'p2' => $param_2], $param_1);
      
      # работать с redis через пул redis
      $this->redis->set($param_1, 0)
 }
    
     //...
}
  1. Отправьте JSON-RPC для запуска этого действия:
    {
        "jsonrpc":"2.0",
        "id":1,
        "method":"foo/bar",
        "params":{
            "param_1":"client_01",
            "param_2":100,
            "param_n":{
                "time":1551408888,
                "type":"report"
            }
        }
    } Эта функция будет полезна для некоторых асинхронных задач, запускаемых из веб-приложения. Пример использования в случае с чатом:

HTTP запрос: 

http://127.0.0.1:8721/rpc?p={"jsonrpc":"2.0","id":1,"method":"room/msg","params":{"id":"100111","content":{"text":"System warning!"}}}

OR redis-cli: 

127.0.0.1:6379> publish rpc '{"jsonrpc":"2.0","id":1,"method":"room/msg","params":{"id":"100111","content":{"text":"System warning!"}}}'

OR в Yii веб-приложение: 

Yii:$app->redis->publish('rpc', '{"jsonrpc":"2.0","id":1,"method":"room/msg","params":{"id":"100111","content":{"text":"System warning!"}}}')

OR используйте Hook (рекомендуется), поддерживающий «runOnce», чтобы метод выполнялся только один раз, даже если запущено несколько экземпляров swoole, см. [immusen/yii2-swoole-websocket/Hook.php](https://github.com/immusen/yii2-swoole-websocket/blob/master/Hook.php)

Yii::$app->hook->run('room/msg', ['id' => 100111, 'content' => ['text' => 'System warning!']]); Yii::$app->hook->runOnce('sms/send', ['mobile' => 15600008721, 'code' => '8721']);


Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Yii2 WebSocket на основе Swoole поддерживает асинхронную передачу задач в Swoole через JSON-RPC с использованием способов Websocket, HTTP или Redis publish. Это позволяет реализовать функции, подобные GatewayWorker. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/immusen-yii2-swoole-websocket.git
git@api.gitlife.ru:oschina-mirror/immusen-yii2-swoole-websocket.git
oschina-mirror
immusen-yii2-swoole-websocket
immusen-yii2-swoole-websocket
master