节点中的并发事件以及向Redis队列添加数据

时间:2013-12-18 11:23:09

标签: php jquery node.js redis

我有一个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()函数)并期望这个新数据在节点中触发新事件。这是不可能的或什么?那么如何管理呢?

0 个答案:

没有答案