● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Вс 2018-07-22 16:48:18 MSK; 3min 8s ago
Process: 13055 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCC
Process: 12939 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Process: 13098 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=1/FAILURE)
Main PID: 12941 (code=exited, status=0/SUCCESS)
file_put_contents('mekas25.txt', $msg, FILE_APPEND);
только для $pull->on('message', function ($msg) {
прописал чтобы проверить приходит ли сообщение. Как выяснилось не приходит. А почему непонятно. 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)
{
}
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.
$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);
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();
}
protected $clients;
public function __construct()
{
$this->clients = new \SplObjectStorage; // Для хранения технической информации об присоединившихся клиентах используется технология SplObjectStorage, встроенная в PHP
}
$loop = ReactLoop::create();
protected $clients;
public function __construct()
{
$this->clients = new \SplObjectStorage;
parent::__construct($this->id, $this->module);
}
/Stack trace:
#0 C:\OpenServer\domains\crmas\vendor\yiisoft\yii2\base\Controller.php(130): yii\base\Action->getUniqueId()
#1 C:\OpenServer\domains\crmas\vendor\yiisoft\yii2\console\Controller.php(128): yii\base\Controller->runAction()
#2 C:\OpenServer\domains\crmas\vendor\yiisoft\yii2\base\Module.php(523): yii\console\Controller->runAction()
#3 C:\OpenServer\domains\crmas\vendor\yiisoft\yii2\console\Application.php(180): yii\base\Module->runAction()
#4 C:\OpenServer\domains\crmas\vendor\yiisoft\yii2\console\Application.php(147): yii\console\Application->runAction()
#5 C:\OpenServer\domains\crmas\vendor\yiisoft\yii2\base\Application.php(380): yii\console\Application->handleRequest()
#6 C:\OpenServer\domains\crmas\yii(27): yii\base\Application->run()
#7 {main}
/**
* Returns the unique ID of the controller.
* @return string the controller ID that is prefixed with the module ID (if any).
*/
public function getUniqueId()
{
return $this->module instanceof Application ? $this->id : $this->module->getUniqueId() . '/' . $this->id;
}
public function __construct()
{
parent::__construct();
}
public function __construct()
{
parent::__construct($this->id, $this->module);
}
<?php
$js = <<<JS
function send(){
var data='Данные для отправки: '+Math.random();
conn.send(data);
console.log('Отправлено: '+data);
}
JS;
$this->registerJs($js);
?>
<button onclick="send();">Send</button>