Websocket rpc server для Yii2 на основе Swoole 4
Websocket-сервер для Yii2, основанный на Swoole версии 4 и выше. Поддерживает JSON-RPC, разрешает «method» как маршрут, отражающий контроллер/действие, а также поддерживает HTTP или Redis pub/sub для запуска асинхронных задач из веб-приложения.
Установка
php composer.phar require --prefer-dist immusen/yii2-swoole-websocket "~1.0"
"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!"
}
}
Кодирование
<?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)
}
//...
}
{
"jsonrpc":"2.0",
"id":1,
"method":"foo/bar",
"params":{
"param_1":"client_01",
"param_2":100,
"param_n":{
"time":1551408888,
"type":"report"
}
}
} Эта функция будет полезна для некоторых асинхронных задач, запускаемых из веб-приложения. Пример использования в случае с чатом:
HTTP запрос:
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 )