Итак, я бегу Ratchet (PHP) WebSocket сервер с несколькими маршрутами, которые соединяют сделать несколько приложений с храповым механизмом (MessageComponentInterfaces):Отправка сообщения из PHP скрипт для нескольких приложений Ratchet WebSocket (через ZMQ гнездо)
//loop
$loop = \React\EventLoop\Factory::create();
//websocket app
$app = new Ratchet\App('ws://www.websocketserver.com', 8080, '0.0.0.0', $loop);
/*
* load routes
*/
$routeOne = '/example/route';
$routeOneApp = new RouteOneApp();
$app->route($routeOne, $routeOneApp, array('*'));
$routeTwo = '/another/route';
$routeTwoApp = new AnotherApp();
$app->route($routeTwo, $routeTwoApp, array('*'));
Отсюда я связываю сокет ZMQ, чтобы получать сообщения, отправленные с php-скриптов, запущенных на обычном сервере Apache.
// Listen for the web server to make a ZeroMQ push after an ajax request
$context = new \React\ZMQ\Context($loop);
$pull = $context->getSocket(\ZMQ::SOCKET_PULL);
$pull->bind('tcp://127.0.0.1:5050'); // Binding to 127.0.0.1 means the only client that can connect is itself
$pull->on('message', array($routeOneApp, 'onServerMessage'));
Наконец, сервер запущен:
//run
$loop->run();
Это отлично работает до тех пор, как я связываю только один из храповых приложений к разъему ZMQ. Тем не менее, я хотел бы иметь возможность отдельно отправлять сообщения в оба приложения Ratchet. Для этой цели я подумал о связывании два ZMQ розетки к разным маршрутам нравятся:
$pullOne->bind('tcp://127.0.0.1:5050' . $routeOne); // Binding to 127.0.0.1 means the only client that can connect is itself
$pullOne->on('message', array($routeOneApp, 'onServerMessage'));
и
$pullTwo->bind('tcp://127.0.0.1:5050' . $routeTwo); // Binding to 127.0.0.1 means the only client that can connect is itself
$pullTwo->on('message', array($routeTwoApp, 'onServerMessage'));
Однако это приводит к сообщению об ошибке от ZMQ при связывании второго гнезда, говоря заданный адрес уже используется.
Вопрос в том, есть ли другой способ использования маршрутов через разъем ZMQ? Или я должен использовать другие средства для различения сообщений для отдельных приложений Ratchet, и если да, то что было бы хорошим решением? Я думал о привязке к двум различным портам, но понял, что это будет довольно уродливое решение ?!
Вы уверены, что хотите связать(), когда в PULL? Обычно в ZMQ сторона PUSH связывается(), сторона PULL соединяет(). – Jack
Хороший вопрос, я скопировал привязку из некоторого учебника, который я нашел в Интернете, и, похоже, он работает. Я посмотрю, работает ли функция connect(). –