Argument 2 passed to React\Socket\Server::__construct() must implement interface React\EventLoop\LoopInterface, none given.
public function __construct()
{
parent::__construct($this->id, $this->module);
}
PHP Fatal Error 'yii\base\ErrorException' with message 'Call to a member function getUniqueId() on null'
public function get () {
$eventModel = [
'subscribeKey' => 'eventMonitoring',
'data' => 'eventData' . rand(1,100)
];
Book::pushEventToSocket($eventModel);
var_dump($eventModel);
}
отправляю, в pushEventToSocket данные приходят, а вот как проверить что они до сервера дошли ?static function pushEventToSocket(array $eventModel)
{
$context = new \ZMQContext();
$socket = $context->getSocket(\ZMQ::SOCKET_PUSH, 'desktop');
if($socket instanceof \ZMQSocket)
{
// Здесь тоже передаём идентификатор, чтобы в push классе мы смогли получить объект topic
$eventModel['subscribeKey'] = 'eventMonitoring';
$eventData = json_encode($eventModel);
$socket->connect("tcp://127.0.0.1:5555");
$socket->send($eventData);
file_put_contents('mekas1.txt', $eventData, FILE_APPEND);
}
}
public function actionPushServer($port=5555)
{
$loop = Factory::create();
// Класс, который реализуем ниже.
$pusher = new EventPusher;
// Listen for the web server to make a ZeroMQ push after an ajax request
$context = new Context($loop);
$pull = $context->getSocket(\ZMQ::SOCKET_PULL);
// Binding to 127.0.0.1 means the only client that can connect is itself
$pull->bind('tcp://127.0.0.1:'.$port);
$pull->on('message', array($pusher, 'onPushEventData'));
// Set up our WebSocket server for clients wanting real-time updates
$webSock = new Server($loop);
// Binding to 0.0.0.0 means remotes can connect
$webSock->listen(8080, '0.0.0.0');
$webServer = new IoServer(
new HttpServer(
new WsServer(
new WampServer(
$pusher
)
)
),
$webSock
);
$loop->run();
}
$pull->bind('tcp://127.0.0.1:'.$port);
$pull->on('message', array($pusher, 'onPushEventData'));
$eventData = json_encode($eventModel);
$socket->connect('tcp://127.0.0.1:'.$port);
$socket->send($eventData);
conn.subscribe('eventMonitoring', function(topic, data) {
// Сюда будут прилетать данные от вашего веб приложения.
console.log(data);
});
public function onPushEventData($event)
{
$eventData = json_decode($event, true);
file_put_contents('mekas3.txt', $eventData, FILE_APPEND);
//Здесь в массиве $eventData мы тоже передаём идентификатор и проверяем есть ли подписанные клиенты.
if (!array_key_exists($eventData['subscribeKey'], $this->subscribedTopics))
{
return;
}
// Через этот идентификатор получаем нужный нам объект instanceof Topic.
$topic = $this->subscribedTopics[$eventData['subscribeKey']];
if($topic instanceof Topic)
{
foreach($eventData as $eventField => &$fieldValue)
$fieldValue = Html::encode($fieldValue);
// Посылаем данные клиенту
$topic->broadcast($eventData);
}
else
{
return;
}
}
$eventModel['subscribeKey'] = 'eventMonitoring';
$eventData = json_encode($eventModel);
$socket->connect("tcp://127.0.0.1:5555");
$socket->send($eventData);
Вот это и есть передача данных. $eventData
Здесь хочу заметить, что там куда они "прилетят", в моём примере это метод onPushEventData
для отладки xdebug и подобные отладки не сработают. Я много времени убил, пытаясь понять где же данные. А оказалось xdebug просто не делал останов в нужном месте ;)
В этом методе, после строчки $eventData = json_decode($event, true); можно поставить отладку, запись в файл, например. и там увидеть данные в массиве $eventData.
public function on($event, callable $listener)
{
if (!isset($this->listeners[$event])) {
$this->listeners[$event] = [];
}
$this->listeners[$event][] = $listener;
return $this;
}
public function send($message, $mode = 0)
{
}
file_put_contents('mekas25.txt', $msg, FILE_APPEND);
только для $pull->on('message', function ($msg) {
прописал чтобы проверить приходит ли сообщение. Как выяснилось не приходит. А почему непонятно.