Vì vậy, tôi đang chạy một Ratchet (php) máy chủ WebSocket với nhiều tuyến đường kết nối làm nhiều ứng dụng Ratchet (MessageComponentInterfaces):Gửi tin nhắn từ PHP kịch bản cho nhiều ứng dụng Ratchet WebSocket (thông qua ZMQ socket)
//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('*'));
Từ đây tôi ràng buộc một socket ZMQ, để có thể nhận được các tin nhắn được gửi từ các script php chạy trên máy chủ apache bình thường.
// 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'));
Cuối cùng, máy chủ được bắt đầu:
//run
$loop->run();
này hoạt động hoàn toàn tốt đẹp miễn là tôi đang chỉ ràng buộc một trong những ứng dụng ratchet sử dụng socket ZMQ. Tuy nhiên, tôi muốn có thể gửi tin nhắn riêng cho cả hai ứng dụng Ratchet. Với mục đích này tôi nghĩ đến việc ràng buộc hai ổ cắm ZMQ để tuyến đường khác nhau thích:
$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'));
và
$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'));
Tuy nhiên, điều này dẫn đến một thông báo lỗi từ ZMQ khi ràng buộc các ổ cắm thứ hai, nói địa chỉ cho đã được sử dụng.
Vì vậy, câu hỏi đặt ra là có cách nào khác để sử dụng các tuyến trên ổ cắm ZMQ không? Hoặc tôi có nên sử dụng các phương tiện khác để phân biệt giữa các tin nhắn cho các ứng dụng Ratchet riêng biệt, và nếu có, giải pháp tốt là gì? Tôi nghĩ về việc liên kết với 2 cổng khác nhau, nhưng tôi nghĩ rằng đó sẽ là một giải pháp khá xấu xí ?!
bạn có chắc chắn muốn liên kết() khi ở trong PULL không? Thông thường trong ZMQ bên PUSH liên kết(), phía PULL kết nối(). – Jack
câu hỏi hay, tôi sao chép các ràng buộc từ một số hướng dẫn tôi tìm thấy trên internet và nó có vẻ làm việc. Tôi sẽ có một cái nhìn nếu connect() hoạt động tốt. –