2013-06-25 59 views
2

我是這些tecnologies的新手。nodejs&redis&socket.io的實時訪問者&php

我想爲我的網站獲得每種產品的實時訪問者。 我的意思是像「X用戶看這個產品」這樣的通知。

無論何時用戶連接到產品,本產品的計數器都會增加,並且當斷開連接計數器的數量將減少到只有該產品。

我試圖搜索大量的文件,但我很困惑。

我正在使用Predis Library for PHP。

我所做的事情可能總是錯的。 我不確定在哪裏放createClient,何時訂閱&何時退訂。

我還沒有完成:

在商品詳細頁:

$key = "product_views_".$product_id; 
$counter = $redis->incr($key); 


$redis->publish("productCounter", json_encode(array("product_id"=> "1000", "counter"=> $counter))); 

在app.js

var app = require('express')() 
, server = require('http').createServer(app) 
, socket = require('socket.io').listen(server,{ log: false }) 
, url = require('url') 
, http= require('http') 
, qs = require('querystring') 
,redis = require("redis"); 

var connected_socket = 0; 

server.listen(8080); 

var productCounter = redis.createClient();  
productCounter.subscribe("productCounter"); 

productCounter.on("message", function(channel, message){ 
    console.log("%s, the message : %s", channel, message); 
    io.sockets.emit(channel,message); 
} 

productCounter.on("unsubscribe", function(){ 
    //I think to decrease counter here, Shold I? and How? 
} 

io.sockets.on('connection', function (socket) { 
    connected_socket++; 
    socket_id = socket.id; 
    console.log("["+socket_id+"] connected"); 

    socket.on('disconnect', function (socket) { 
      connected_socket--; 
      console.log("Client disconnected"); 
      productCounter.unsubscribe("productCounter"); 
    }); 

}) 

非常感謝您的回答!

回答

0

如果訪問者使用您的網站作爲沒有Socket.IO的普通網站,那麼您可能會重新考慮整個跟蹤方法。 爲了做到這一點,沒有任何前端工作,可能導致性能問題認爲這種方法:

我會選擇MongoDB(隨意使用redis類似的方法)與智能過期索引(這將如果創建到期現在文件 - 時間戳將不再那麼10秒)
db.views.ensureIndex({ timestamp: 1 }, { expireAfterSeconds: 10 })

,並會創造產品索引快速計數
db.views.ensureIndex({ product: 1 })

您可以創建文檔,通過這種結構:
_id: '(int)userId'
product: '(int)productId'
timestamp: new Date() (have expire index on this one.)

當用戶來到查看產品,PHP將記錄用戶ID(_id),的productId(產品)和本日期時間(時間戳)。如果找不到文檔,請使用upsert標誌更新以便插入。 這將確保一個用戶目前只能查看一個產品,並且會有效地將記錄過期並在用戶導航時切換到其他產品。
db.views.count({ product: 42 }) - 將輸出當前查看產品42的用戶數。