在我的web應用程序(symfony3)中,我試圖集成一個實時通知系統。 我選擇具有這種配置做到了這一點: 服務器的NodeJS 服務器redis的 socket.io socket.io-PHP極 - 發射極(PHP adaptater直接從PHP EMIT通知)使用socket.io和redis實時通知
app.js(服務器節點)
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');
測試控制器
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()
));
}
客戶端視圖
$(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;
});
});
好吧,這個簡單的測試工作正常:當我從正確的視圖提交表單時,通知顯示在此頁面上的所有客戶端。
1-現在我想讓一個用戶只能向另一個用戶發送通知(當用戶發表評論時,該帖子的作者收到通知)。我如何做到這一點?
2-如果作者沒有連接,如何在作者連接時保存通知以顯示它?
如果你問我,這是一個相當廣泛的問題。有很多方法可以實現這一點。一種方法是將其存儲到數據庫並在頁面加載或w/e中檢索它。 –