我有一个Web应用程序,它使用PHP来提供静态页面,使用Node.js进行实时更新。为了实现实时更新,PHP将数据添加到Redis队列,并使用Redis队列按节点更新页面。但是在下面的scneario中,数据没有添加到队列中,我找不到它背后的原因。
1-用户更新值,节点接收此通知并在节点服务器内调用sendSomeUpdateToPHP
函数。
client.on( 'someUpdate', function( data ) {> sendSomeUpdateToPHP(data.id, data.value); });
2- sendSomeUpdateToPHP
向PHP服务器发出HTTP请求(在同一服务器,不同端口上运行)
function sendSomeUpdateToPHP(_id, _value){ $.ajax({ url: localhost+':'+PHP_PORT+"/someURL", type: "GET", data: {'id' : _id, 'value': _value}, success: function(data){ return false; }, error: function(data){ console.log( 'Error ' + data.responseText); } }); }
3- PHP函数接收请求并将新数据添加到Redis队列。 NB。在sendSomeUpdateToPHP()
函数调用结束之前,新数据将添加到队列中。
function somePHPFunction(){
....
....
self::$redis->lpush('elements', $return_value);
}
4-最后,由于队列中有新项目并更新客户端,因此应该通知节点中的循环。但它并没有因为添加到队列中的数据以某种方式消失/丢失等等。这是节点服务器的所有相关部分:
//Call this function in the very beginning and start the loop
nodeSendElements();
io.sockets.on( 'connection', function( client ) {
client.on( 'someUpdate', function( data ) {
sendSomeUpdate(data.id, data.value);
});
});
function nodeSendElements(){
redisclient.blpop('elements', 0, function(err, data)
{
// send elements to everyone connected
io.sockets.emit('elements', data[1]);
// event loop
process.nextTick(nodeSendElements);
});
};
简而言之:我在上一个事件最终确定之前将新数据添加到队列中(sendSomeUpdateToPHP()
函数)并期望这个新数据在节点中触发新事件。这是不可能的或什么?那么如何管理呢?