WebSocket

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
HaliGali
Сообщения: 3
Зарегистрирован: 2017.11.30, 14:43

WebSocket

Сообщение HaliGali » 2017.12.12, 22:53

Приветствую всех участников. Помогите разобраться с websoket - ами. В общем, что есть:
1. Два воркера которые крутятся как демоны tcp и websocket (в качестве расширения использовал workerman/worker)
2. Есть клиентский код, который что то отсылает на сервер, что то принимает.

Задача: Мне нужно отслеживать когда пользователь покидает одну определенную страницу. С этим проблем нет, ловлю его в событии

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

$worker->onClose = function($connect){}
А далее мне нужно произвести некую валидацию данных и по результатам этой валидации произвести некие действия с базой данных.

Так вот я не могу понять, каким образом я из демона (т.е. php-cli) могу передать данные на php-fpm? Ведь это совершенно разные процессы. Даже если я внутри воркера, подключу некий класс из основного приложения, он все равно будет запущен в контексте cli процесса. А он в свою очередь ничего не знает ни о бд ни о сессия ни о куках. Подозреваю что что то не так с архитектурой, но я не смог нигде найти информацию как вообще можно передать данный из php-cli в php-fpm. В обратную сторону (из php-fpm в php-cli) передаю без проблем при помощи stream_socket_client() и fwrite(); Но тут все понятно. Демон крутится без остановки. К нему я могу обратитья в любой момент. Но php-fpm не слушает никаких портов. Он обработал запрос и благополучно умер.

Что напрашивается, так это поднимать всю инициализацию Yii->$app внутри демона. Либо работать с базой данных напрямую из воркера. Но как по мне, ни тот ни другой вариант не комильфо. Получается что я вообще никак не могу определить, что за пользователь только что отключился?

Пожалуйста просветите в вопросе нуба. Я уже просто устал )

Nex-Otaku
Сообщения: 825
Зарегистрирован: 2016.07.09, 21:07

Re: WebSocket

Сообщение Nex-Otaku » 2017.12.13, 09:26

Можно по-разному сделать. Например, просто передаёшь всю инфу в консольной команде:
yii worker-api/page-closed <твои данные>

На стороне Yii соответственно контроллер и действие, настройки БД берутся из конфигов консольного приложения (обычно настройки БД описаны в "common/config/main-local.php" для всех приложений).

Так настройки тебе будут доступны, все классы приложения тоже.

Сессия тебе и не нужна. Если что-то в куках есть полезное, передаёшь это воркеру, из него в консольную команду вместе с прочими данными.

HaliGali
Сообщения: 3
Зарегистрирован: 2017.11.30, 14:43

Re: WebSocket

Сообщение HaliGali » 2017.12.13, 15:26

Спасибо большое. Разобрался. Почему то думал что exec(), допустим, внутри демона будет бесполезен. Ан нет, все работает ). Я в восторге, открыл для себя как на чистом php оказывается можно писать real-time application )

HaliGali
Сообщения: 3
Зарегистрирован: 2017.11.30, 14:43

Re: WebSocket

Сообщение HaliGali » 2017.12.13, 15:49

Nex-Otaku, извиняюсь за назойливость, но вы говорили:
Nex-Otaku писал(а):
2017.12.13, 09:26
Можно по-разному сделать.
Можно немного в общих чертах о других способах? Буду очень признателен. По моей задаче все решено, но для общего развития лишним не будет :geek:

Nex-Otaku
Сообщения: 825
Зарегистрирован: 2016.07.09, 21:07

Re: WebSocket

Сообщение Nex-Otaku » 2017.12.14, 09:15

Я деталей твоего приложения не знаю, поэтому ничего конкретного не посоветую.

Аватара пользователя
zabachok
Сообщения: 519
Зарегистрирован: 2013.12.16, 14:38

Re: WebSocket

Сообщение zabachok » 2017.12.14, 14:39

Можно запустить сервер внутри йии и тогда вам будет прям в демоне доступны все возможности фреймворка. Останется только придумать механизм разруливания разных мессаджей и все.
https://github.com/morozovsk/yii2-websocket
2b||!2b Just read the instructions

Ответить