Настройка websocket сервера workerman+yii2. Как подключить?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
kornell_RU
Сообщения: 12
Зарегистрирован: 2017.09.14, 22:37

Настройка websocket сервера workerman+yii2. Как подключить?

Сообщение kornell_RU » 2018.01.16, 18:56

Приветствую всех, требуется настроить websocket сервер в связке с Yii2 и для этого решил использовать workerman. Нашел такое решение:

Код: Выделить всё

use Workerman\Worker;

require(__DIR__ . '/vendor/autoload.php');
require(__DIR__ . '/vendor/yiisoft/yii2/Yii.php');

$config = require(__DIR__ . '/config/console.php');
new yii\console\Application($config);
// Create a Websocket server
$ws_worker = new Worker("websocket://0.0.0.0:2346");

// 4 processes
$ws_worker->count = 4;

// Emitted when new connection come
$ws_worker->onConnect = function($connection)
{
    echo "New connection\n";
 };

// Emitted when data received
$ws_worker->onMessage = function($connection, $data)
{
    // Send hello $data
    $connection->send('hello ' . $data);
};

// Emitted when connection closed
$ws_worker->onClose = function($connection)
{
    echo "Connection closed\n";
};

// Run worker
Worker::runAll();
Этот код советуют размещать в корне проекта, но хотелось бы обращаться через контроллеры консольного приложения. Может есть другие способы подключить workerman к yii2? Или может кто то подскажет, на чем лучше сделать websocket сервер?


kornell_RU
Сообщения: 12
Зарегистрирован: 2017.09.14, 22:37

Re: Настройка websocket сервера workerman+yii2. Как подключить?

Сообщение kornell_RU » 2018.01.16, 21:18

первое для yii2, сам автор советует использовать workerman, а consik/yii2-websocket у меня не заработал. Выдает ошибку, о том что не найден

Код: Выделить всё

Ratchet\MessageComponentInterface

в файле

Код: Выделить всё

WebSocketServer.php
но путь в use прописан.
Использовал пример из доков:

Simple echo server

Create your server class based on WebSocketServer. For example daemons\EchoServer.php:

Код: Выделить всё

<?php
namespace app\daemons;

use consik\yii2websocket\events\WSClientMessageEvent;
use consik\yii2websocket\WebSocketServer;

class EchoServer extends WebSocketServer
{

    public function init()
    {
        parent::init();

        $this->on(self::EVENT_CLIENT_MESSAGE, function (WSClientMessageEvent $e) {
            $e->client->send( $e->message );
        });
    }

}
Create yii2 console controller for starting server:

Код: Выделить всё

<?php
namespace app\commands;

use app\daemons\EchoServer;
use yii\console\Controller;

class ServerController extends Controller
{
    public function actionStart($port = null)
    {
        $server = new EchoServer();
        if ($port) {
            $server->port = $port;
        }
        $server->start();
    }
}
Start your server using console:

Код: Выделить всё

   php yii server/start

Есть ли возможность работать с workerman и ли настроить consik/yii2-websocket?

urichalex
Сообщения: 615
Зарегистрирован: 2015.08.07, 11:03

Re: Настройка websocket сервера workerman+yii2. Как подключить?

Сообщение urichalex » 2018.01.16, 22:29

Возможность есть. Кто-то китайский даже сделал для yii
Либо самому писать свою реализацию.
А в выборе между consik/yii2-websocket и morozovsk/yii2-websocket я бы посоветовал второе

kornell_RU
Сообщения: 12
Зарегистрирован: 2017.09.14, 22:37

Re: Настройка websocket сервера workerman+yii2. Как подключить?

Сообщение kornell_RU » 2018.01.17, 15:13

urichalex писал(а):
2018.01.16, 22:29
Возможность есть. Кто-то китайский даже сделал для yii
Либо самому писать свою реализацию.
А в выборе между consik/yii2-websocket и morozovsk/yii2-websocket я бы посоветовал второе
И в morozovsk/yii2-websocket , подобная проблема)
ввожу:

Код: Выделить всё

php yii websocket/start chat3
Получаю ошибку:

Код: Выделить всё

Exception 'Error' with message 'Class 'morozovsk\websocket\Server' not found'

in /var/www/api.parad/vendor/morozovsk/yii2-websocket/console/controllers/WebsocketController.php:15

Stack trace:
#0 [internal function]: morozovsk\yii2websocket\console\controllers\WebsocketController->actionStart('chat3')
#1 /var/www/api.parad/vendor/yiisoft/yii2/base/InlineAction.php(57): call_user_func_array(Array, Array)
#2 /var/www/api.parad/vendor/yiisoft/yii2/base/Controller.php(157): yii\base\InlineAction->runWithParams(Array)
#3 /var/www/api.parad/vendor/yiisoft/yii2/console/Controller.php(135): yii\base\Controller->runAction('start', Array)
#4 /var/www/api.parad/vendor/yiisoft/yii2/base/Module.php(528): yii\console\Controller->runAction('start', Array)
#5 /var/www/api.parad/vendor/yiisoft/yii2/console/Application.php(180): yii\base\Module->runAction('websocket/start', Array)
#6 /var/www/api.parad/vendor/yiisoft/yii2/console/Application.php(147): yii\console\Application->runAction('websocket/start', Array)
#7 /var/www/api.parad/vendor/yiisoft/yii2/base/Application.php(386): yii\console\Application->handleRequest(Object(yii\console\Request))
#8 /var/www/api.parad/yii(20): yii\base\Application->run()
#9 {main}
Расширение не находит сам вебсокет, хотя он лежит в той же папке что и расширение)
Что то мне кажется, что у меня чего то не хватает) Может кто то сталкивался с этим?)

kornell_RU
Сообщения: 12
Зарегистрирован: 2017.09.14, 22:37

Re: Настройка websocket сервера workerman+yii2. Как подключить?

Сообщение kornell_RU » 2018.01.17, 17:13

Попытался настроить workerman) И здесь такая же ошибка)) пути везде правильно прописал) Может кто то сталкивался?)

Код: Выделить всё

Error: Class 'Workerman\Worker' not found

kornell_RU
Сообщения: 12
Зарегистрирован: 2017.09.14, 22:37

Re: Настройка websocket сервера workerman+yii2. Как подключить?

Сообщение kornell_RU » 2018.01.17, 17:18

kornell_RU писал(а):
2018.01.17, 17:13
Попытался настроить workerman) И здесь такая же ошибка)) пути везде правильно прописал) Может кто то сталкивался?)

Код: Выделить всё

Error: Class 'Workerman\Worker' not found
Вот сам код)

Код: Выделить всё

<?php

namespace app\commands;
use Workerman\Worker;
use yii\console;

// подключение автозагрузчика Composer
require __DIR__ . '/../vendor/autoload.php';

// подключение файла класса Yii
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';

$config = require __DIR__ . './../config/console.php';

$application = new \yii\console\Application($config);

$ws_worker = new Worker("websocket://0.0.0.0:8000");

// 4 processes
$ws_worker->count = 4;

// Emitted when new connection come
$ws_worker->onConnect = function($connection)
{
    echo "New connection\n";
};

// Emitted when data received
$ws_worker->onMessage = function($connection, $data)
{
    // Send hello $data
    $connection->send('hello ' . $data);
};

// Emitted when connection closed
$ws_worker->onClose = function($connection)
{
    echo "Connection closed\n";
};

// Run worker
Worker::runAll();

kornell_RU
Сообщения: 12
Зарегистрирован: 2017.09.14, 22:37

Re: Настройка websocket сервера workerman+yii2. Как подключить?

Сообщение kornell_RU » 2018.01.17, 17:59

Получилось запустить workerman)
Нужно было явно прописать классы. Библиотека требует явного подключения всех файлов, содержащих классы.
Всего лишь нужно было очень хорошо перечитать документацию)

Код: Выделить всё

<?php

namespace app\commands;

// подключение автозагрузчика Composer
require __DIR__ . '/../vendor/autoload.php';

// подключение файла класса Yii
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';

$config = require __DIR__ . './../config/console.php';
use \workerman\Worker;
use yii\console;
use Yii;

Yii::$classMap['Workerman\Worker'] = __DIR__ . '/../vendor/workerman/workerman/Worker.php';
Yii::$classMap['Workerman\Lib\Timer'] = __DIR__ . '/../vendor/workerman/workerman/Lib/Timer.php';
Yii::$classMap['Workerman\Autoloader'] = __DIR__ . '/../vendor/workerman/workerman/Autoloader.php';

$application = new \yii\console\Application($config);

$ws_worker = new \Workerman\Worker("websocket://0.0.0.0:8000");

// 4 processes
$ws_worker->count = 4;

// Emitted when new connection come
$ws_worker->onConnect = function($connection)
{
    echo "New connection\n";
};

// Emitted when data received
$ws_worker->onMessage = function($connection, $data)
{
    // Send hello $data
    $connection->send('hello ' . $data);
};

// Emitted when connection closed
$ws_worker->onClose = function($connection)
{
    echo "Connection closed\n";
};

// Run worker
Worker::runAll();

urichalex
Сообщения: 615
Зарегистрирован: 2015.08.07, 11:03

Re: Настройка websocket сервера workerman+yii2. Как подключить?

Сообщение urichalex » 2018.01.17, 18:03

Workerman никакого отношения к yii не имеет. Это ты в yii-шный автолоад прописал все эти классы. Ты композер то хоть обновлял или просто тупо папки скопировал?

kornell_RU
Сообщения: 12
Зарегистрирован: 2017.09.14, 22:37

Re: Настройка websocket сервера workerman+yii2. Как подключить?

Сообщение kornell_RU » 2018.01.19, 00:31

urichalex писал(а):
2018.01.17, 18:03
Workerman никакого отношения к yii не имеет. Это ты в yii-шный автолоад прописал все эти классы. Ты композер то хоть обновлял или просто тупо папки скопировал?
Ставил через композер, но почему то не видит автолоадер воркера. В данный момент все работает. Если Есть предложения по улучшению кода, я вас слушаю.

urichalex
Сообщения: 615
Зарегистрирован: 2015.08.07, 11:03

Re: Настройка websocket сервера workerman+yii2. Как подключить?

Сообщение urichalex » 2018.01.19, 02:29

kornell_RU писал(а):
2018.01.19, 00:31
urichalex писал(а):
2018.01.17, 18:03
Workerman никакого отношения к yii не имеет. Это ты в yii-шный автолоад прописал все эти классы. Ты композер то хоть обновлял или просто тупо папки скопировал?
Ставил через композер, но почему то не видит автолоадер воркера. В данный момент все работает. Если Есть предложения по улучшению кода, я вас слушаю.
какого кода?

kornell_RU
Сообщения: 12
Зарегистрирован: 2017.09.14, 22:37

Re: Настройка websocket сервера workerman+yii2. Как подключить?

Сообщение kornell_RU » 2018.01.19, 14:41

urichalex писал(а):
2018.01.19, 02:29
kornell_RU писал(а):
2018.01.19, 00:31
urichalex писал(а):
2018.01.17, 18:03
Workerman никакого отношения к yii не имеет. Это ты в yii-шный автолоад прописал все эти классы. Ты композер то хоть обновлял или просто тупо папки скопировал?
Ставил через композер, но почему то не видит автолоадер воркера. В данный момент все работает. Если Есть предложения по улучшению кода, я вас слушаю.
какого кода?
Я за этот имел ввиду.

Код: Выделить всё

<?php

namespace app\commands;

// подключение автозагрузчика Composer
require __DIR__ . '/../vendor/autoload.php';

// подключение файла класса Yii
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';

$config = require __DIR__ . './../config/console.php';
use \workerman\Worker;
use yii\console;
use Yii;

Yii::$classMap['Workerman\Worker'] = __DIR__ . '/../vendor/workerman/workerman/Worker.php';
Yii::$classMap['Workerman\Lib\Timer'] = __DIR__ . '/../vendor/workerman/workerman/Lib/Timer.php';
Yii::$classMap['Workerman\Autoloader'] = __DIR__ . '/../vendor/workerman/workerman/Autoloader.php';

$application = new \yii\console\Application($config);

$ws_worker = new \Workerman\Worker("websocket://0.0.0.0:8000");

// 4 processes
$ws_worker->count = 4;

// Emitted when new connection come
$ws_worker->onConnect = function($connection)
{
    echo "New connection\n";
};

// Emitted when data received
$ws_worker->onMessage = function($connection, $data)
{
    // Send hello $data
    $connection->send('hello ' . $data);
};

// Emitted when connection closed
$ws_worker->onClose = function($connection)
{
    echo "Connection closed\n";
};

// Run worker
Worker::runAll();
Если есть у вас идеи как можно его оптимизировать и привести в нормальный вид или подружить с консольными контроллерами yii, то с радостью приму вашу помощь.

urichalex
Сообщения: 615
Зарегистрирован: 2015.08.07, 11:03

Re: Настройка websocket сервера workerman+yii2. Как подключить?

Сообщение urichalex » 2018.01.19, 16:24

Оптимизировать код из примера?..

kornell_RU
Сообщения: 12
Зарегистрирован: 2017.09.14, 22:37

Re: Настройка websocket сервера workerman+yii2. Как подключить?

Сообщение kornell_RU » 2018.01.20, 02:43

urichalex писал(а):
2018.01.19, 16:24
Оптимизировать код из примера?..
Угу)
Я имею ввиду, что если я неправильно описал работу воркера, то подскажите как сделать правильно.
Может у кого то есть примеры работы с данной средой, поделитесь если не жалко? Думаю многим будет полезно.
Если в автолоад yii не нужно грузить эти классы, то как их добавить? Через use
не видит. Консоль постоянно выдает ошибку, что класс не найден.

urichalex
Сообщения: 615
Зарегистрирован: 2015.08.07, 11:03

Re: Настройка websocket сервера workerman+yii2. Как подключить?

Сообщение urichalex » 2018.01.20, 14:24

kornell_RU писал(а):
2018.01.20, 02:43
urichalex писал(а):
2018.01.19, 16:24
Оптимизировать код из примера?..
Угу)
Я имею ввиду, что если я неправильно описал работу воркера, то подскажите как сделать правильно.
Может у кого то есть примеры работы с данной средой, поделитесь если не жалко? Думаю многим будет полезно.
Если в автолоад yii не нужно грузить эти классы, то как их добавить? Через use
не видит. Консоль постоянно выдает ошибку, что класс не найден.
если класс не найден, значит его нет в автолоадере композера. Выполни composer dump-autoload, если, конечно, зависимость все-таки прописана в composer.json

Ответить