ZMQ Context не отправляет данные из браузера / PHP, но работает из CMD / CLI (Windows 10) - PullRequest
0 голосов
/ 09 ноября 2019

Вызов post.php через командную строку отправит данные на мой сервер веб-сокетов. Если вы вызываете тот же сценарий через браузер, это не так.

Эта проблема возникает только на моем локальном компьютере. После развертывания в Centos 7 с той же версией / настройкой PHP он корректно работает из браузера, как следует.

1) Изменение IP-адреса привязки сервера к 0.0.0.0 вместо 127.0.0.1
2) Изменены сервер и клиентports

// This is our new stuff
$context = new ZMQContext();
$socket = $context->getSocket(ZMQ::SOCKET_PUSH, 'my pusher');
$socket->connect("tcp://127.0.0.1:55555");
$socket->send(json_encode($entryData));

Ожидаемый результат - вывод данных на CLI / CMD. Это не происходит локально. Нет ошибок.

1 Ответ

0 голосов
/ 10 ноября 2019

Q : ZMQ Context is не отправляет данные из браузера / PHP

Со всемиуважение к наблюдаемому разочарованию, живя с ZeroMQ в течение некоторого времени, начиная с 2.11+, и сейчас некоторое время, я бы осмелился сказать несколько слов о ZeroMQ Design & Art of Zen-of-Zero.

Учитывая, что ваш MCVE-код даже не пытается собрать и проверить безошибочное состояние, во время выполнения анализ сложно построить, не имея доступных деталей.

Вместо того, чтобы гадать,
Лучший следующий шаг: установить сокет - Monitor, чтобы увидеть все события LIVE

Ваш контекст использованияработает с tcp:// -транспортным классом, так что вы счастливы иметь возможность раскрутить сокет- Monitor

Галерея событий,что сокет - Monitor может сканировать / сообщать в реальном времени сеанса по мере их появления, так что можно УСТАНОВИТЬ как любое ожидаемое поведение (иОрдr событий) и / или обнаружение любых неожиданных событий (ы) - по мере их появления:

ZMQ_EVENT_CONNECTED,
ZMQ_EVENT_CONNECT_DELAYED,
ZMQ_EVENT_CONNECT_RETRIED,
ZMQ_EVENT_LISTENING,
ZMQ_EVENT_BIND_FAILED,
ZMQ_EVENT_ACCEPTED,
ZMQ_EVENT_ACCEPT_FAILED,
ZMQ_EVENT_CLOSED,
ZMQ_EVENT_CLOSE_FAILED,
ZMQ_EVENT_DISCONNECTED,
ZMQ_EVENT_MONITOR_STOPPED,
ZMQ_EVENT_HANDSHAKE_FAILED,
ZMQ_EVENT_HANDSHAKE_SUCCEED

Как создать сокет ZeroMQ- Monitor?

ZeroMQ использует двухстороннюю инфраструктуру, где часть 1) создается "внутри" механизма экземпляров Context() путем вызоваthe:
int zmq_socket_monitor ( void *socket, char *endpoint, int events );

Это сделает первую половину работы - оснастит Context() новым (внутренним, оснащенным уже выданным внутренним .bind()в inproc:// -транспортный класс) AccessPoint , поэтому он готов к внешнему .connect() -еду из второй половины сокета- Monitor - внешний ZMQ_PAIR основанный на архетипе прослушиватель событий (кто бы ни играл эту роль)

часть 2) инфраструктуры просто .connect() к первой части, а остальное ваше. Документация API определяет все подробности о многокадровых сообщениях, отправляемых по этой ссылке из экземпляра monitored- Context() в руки monitor-Listener.

Учитывая проблему, определенную выше, этот сокет- Monitor обязательно отразит все события, полученные из ZeroMQ-ZMTP / RFC, и сделает их отчетами в естественной последовательности по мере их появления (если они появляются) и Monitor -Listener может пометить каждое из них отметкой времени с точностью до наносекунды и отобразить их в отдельном (выделенная диагностика телеметрии) GUI / CLI.

zmq_socket_monitor() метод позволяет потоку приложения отслеживать события сокета (например, соединения) на сокете ZeroMQ. Каждый вызов этого метода создает сокет ZMQ_PAIR и связывает его с указанной конечной точкой inproc://. Чтобы собрать события сокета, вы должны создать свой собственный ZMQ_PAIR сокет и подключить его к конечной точке.

Аргумент events является битовой маской сокетасобытия, которые вы хотите отслеживать, см. ниже «Поддерживаемые события». Чтобы отслеживать все события, используйте значение события ZMQ_EVENT_ALL.

ПРИМЕЧАНИЕ: при добавлении новых событий значение перехвата всехначну их возвращать. Приложение, которое использует строгую и фиксированную последовательность событий, не должно использовать ZMQ_EVENT_ALL, чтобы гарантировать совместимость с будущими версиями.

Каждое событие отправляется какдва кадра. Первый кадр содержит номер события (16 бит) и значение события (32 бита), который предоставляет дополнительные данные в соответствии с номером события. Второй кадр содержит строку, которая указывает затронутую конечную точку TCP или IPC.

Для примера кода монитора-декодера, можете посмотреть здесь .

...