Comments (6)
Здравствуйте. Большое спасибо за отзыв!
Вместе с библиотекой идёт файл Test.php - он открывает 1.5к соединений.
Для тестирования я просто запускаю его несколько раз в разных вкладках терминала, например, если запустить его 10 раз, то будет открыто 15к соединений.
Для поддержки более 1024 соединений не обязательно всё переписывать на воркеры, достаточно установить pecl/event или pecl/libevent и в конфиге указать 'eventDriver' => 'event' или 'eventDriver' => 'libevent'
from websocket.
Благодарю за наводку про PECL Event.
Сейчас поставили его, начали тестировать, результаты такие:
У нас два демона вебсокетов, один с локальным сокетом, а второй нет (чат).
Так вот, демон без локального сокета ведет себя замечательно, запускаю несколько Test.php, при этом ещё порядка 60-80 живых соединений, при отправке сообщений в чат - все доходит без задержек.
Иначе дела обстоят дела с демоном, у которого имеется локальный сокет. Цель нашего демона вебсокетов - оповещать о новой информации, переключаем его на 'eventDriver' => 'event', далее другой демон (не вебсокетов) по мере обработки информации пишет в локальный сокет таким способом:
$instance = stream_socket_client ($localsocket, $errno, $errstr);
И наблюдаем такую картинку - некоторые сообщения при записи в локальный сокет моментально приходят на демон вебсокетов и разлетаются дальше клиентам, а некоторые (чуть побольше размером) - не сразу приходят, а с некоторой задержкой (либо вообще не приходят). Возвращаемся на socket_select - все работает замечательно, любых размеров информация быстро доставляется через локальный сокет.
Вопрос собственно в чем, не сталкивались ли Вы при тестировании с такой рода "задержкой" при записи в локальный сокет, если используется PECL Event?
Не знаем откуда начать копать, т.к при возврате на socket_select все летает при 400-600 живых коннектов.
from websocket.
информации много, но она запутанная :) Итак, у вас всего 2 демона или 3? Как я понял ситуацию:
Первый демон с локальным сокетом
Второй демон без локального сокета
Третий демон использует конструкцию $instance = stream_socket_client ($localsocket, $errno, $errstr); чтобы передать данные в локальный сокет первого демона.
Все демоны используют 'eventDriver' => 'event'.
Если всё так, то лучше для записи из третьего демона использовать sendToMaster() вместо $instance = stream_socket_client ($localsocket, $errno, $errstr); предварительно указав в конфиге 'master' => 'локальный_сокет_первого_демона'
from websocket.
Да, Вы все верно поняли, только небольшое уточнение по поводу третьего демона
Третий демон - это не демон вебсокетов, это просто бесконечный while, перед которым сначала подключаемся к локальному сокету используя конструкцию $instance = stream_socket_client ($localsocket, $errno, $errstr);
а далее, уже в while, пишем в него.
Немного потестировав, нашли проблему, ей оказалась константа SOCKET_BUFFER_SIZE = 1024 в классе GenericEvent.
Как выяснилось, мы периодически записывали в локальный сокет данные размером ~ 3000.
Увеличили размер константы SOCKET_BUFFER_SIZE и все заработало (НО, повторюсь, на socket_select все работало на стандартных настройках)
На данный момент полет нормальный, тестировали файлом Test.php - тоже все отлично!
Теперь количество коннектов упирается только в ulimit и ресурсы системы?
from websocket.
мы периодически записывали в локальный сокет данные размером ~ 3000
Интересует с помощью какой функции вы записывали туда данные? Если вы использовали функцию fwrite(), то проверяли ли её ответ на количество байт которых было успешно отправлено, чтобы потом отправить данные которые не были отправлены?
Например:
$written = fwrite($connect, $string);//количество записанных байт в сокет
$string = substr($string, $written);//оставшаяся часть строки
if ($string) {
stream_select(null, [$connect], [], null);
$written = fwrite($connect, $string);
}
from websocket.
Для записи использовали функцию fwrite, не проверяли, сколько ф-я записла, сейчас проверили, результаты такие:
Записываем строку длиной 2858, при любом значении SOCKET_BUFFER_SIZE (512/1204/4096) в классе GenericEvent, fwrite возвращает 2858 (непонятно, с чего бы это вдруг?) Но данные приходят только при 4096.
Попробовали принудительно разбить на части так: fwrite($connect, $string, 1024)
Данные прилетают через раз.
Странно, почему себя так fwrite ведет?
P.S Debian 8, PHP 5.6.14, event 1.11.1, libcurl4-openssl-dev
from websocket.
Related Issues (20)
- Как подружить с pg_notify HOT 4
- GenericEvent считывает не весь буфер HOT 2
- список онлайн юзеров HOT 8
- Отправка изображения через вебсокет
- Работа в Safari HOT 1
- wss timeot HOT 17
- stream_select(): supplied argument is not a valid stream resource HOT 7
- Не закрывает соединение при окончании на сайте HOT 4
- Как сделать многопоточность? HOT 6
- request response order HOT 1
- Можно ли создавать комнаты? HOT 12
- PHP Client HOT 3
- Один конект по сокету на несколько вкладок HOT 2
- Потраченное время на разработку. HOT 4
- Не сбрасываются коннекты HOT 12
- "Залипает" при слишком длинном handshake-сообщение (режим event) HOT 4
- websocket lunch on remote host HOT 1
- Ошибка при остановке HOT 2
- Каково потребление памяти и cpu при нагрузке в 100 000 соединений? HOT 4
- Почему бросили? HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from websocket.