In meiner Web-App (symfony3) versuche ich ein Echtzeit-Benachrichtigungssystem zu integrieren. I zu wählen, erfolgt dies mit dieser Konfiguration: Server NodeJS Server redis Socket.io socket.io-PHP-Emitter (php Adaptater für Emit Benachrichtigung direkt von php)Echtzeit-Benachrichtigung mit socket.io und redis
app.js (Serverknoten)
var app = require('express')();
var http = require('http').Server(app);
var server = require('http').createServer();
var io = require('socket.io').listen(server);
var redis = require('socket.io-redis');
io.sockets.on('connection', function (socket) {
console.log('user connected!');
});
io.adapter(redis({ host: 'localhost', port: 6379 }));
server.listen(8081, 'myhost');
Prüfsteuerung
public function testAction(Request $request)
{
$notification = 'A message has been received by the server!<br />'
$form = $this->createFormBuilder()->getForm();
$form->handleRequest($request);
if ($form->isValid()) {
$redis = new \Redis();
$redis->connect('127.0.0.1', '6379');
$emitter = new SocketIO\Emitter($redis);
$emitter->emit('notification', $notification);
$response = new JsonResponse();
$response->setData(array(
'notification' => $notification
));
return $response;
}
return $this->render('@PMPlatform/Test/test.html.twig', array(
'form' => $form->createView()
));
}
Client Ansicht
$(document).ready(function() {
// Getting socket
var socket = io('http://myhost:8081');
// Listening on notification from server
socket.on('notification', function (data) {
$('.server').append('qsfdqsfdqsdfqsfdqsfd');
});
// Listener on form submit event
$(document).on('submit', '.form', function(e) {
e.preventDefault();
$.ajax({
type: 'POST',
url: '/app_dev.php/test',
data: $(this).serialize(),
success : function(response){
$('.client').append('A message has been sent to server from this client!<br />');
},
error : function(response){
console.log('Something went wrong.');
},
cache: false
});
return false;
});
});
Ok dieser einfache Test funktioniert gut: Wenn ich das Formular aus der richtigen Ansicht absende, wird eine Benachrichtigung an alle Clients angezeigt, die sich auf dieser Seite befinden.
1- Jetzt möchte ich einen Benutzer in der Lage sein, eine Benachrichtigung nur an einen anderen Benutzer zu senden (wenn ein Benutzer einen Beitrag kommentiert, der Autor des Beitrags erhielt eine Benachrichtigung). Wie kann ich das machen?
2- Wenn der Autor nicht angeschlossen ist, Wie kann ich die Meldung zu speichern, es zu zeigen, wenn der Autor wieder verbindet?
Das ist eine ziemlich große Frage, wenn Sie mich fragen. Es gibt viele Möglichkeiten, dies zu erreichen. Eine Möglichkeit besteht darin, sie in einer Datenbank zu speichern und sie beim Laden der Seite oder w/e abzurufen. –