網頁後台是基於PHP+Mysql+Redis+Nginx的,想問下查看網頁同時線上(同時查看網頁)的人數有多少,有什麼方案呀?
回複內容:
網頁後台是基於PHP+Mysql+Redis+Nginx的,想問下查看網頁同時線上(同時查看網頁)的人數有多少,有什麼方案呀?
這裡有個基於workerman開發的非常精確的統計線上人數的開源組件 http://www.workerman.net/web-sender
效果:
能夠非常即時的統計線上使用者數,甚至統計使用者目前開啟了多少個頁面。效果如下
線上demo見http://www.workerman.net/頁面底部
原理
原理是頁面開啟後js建立一個與服務端的socket長串連,頁面通過這個socket串連發送一個uid登入請求,服務端就知道這個串連是哪個使用者的,如果使用者的所有串連都關閉了,說明使用者下線。同時根據有多少個socket串連,就知道整個網站有多少頁面正在開著。由於是socket可以即時監測到串連事件和串連斷開事件,所以非常資料是非常即時的。服務端採用workerman,非輪詢,效能非常高。
服務端使用方法
下載後直接在命令列 php start.php start -d
啟動介面類似如下:
用戶端使用方法
其它
這個組件不僅可以統計線上使用者資料,更強大的是可以在服務端向任意使用者的網頁即時推送資料,效果類似如下
即時性要求不那麼高的話,就基於當前有效session數量(基於cookie)
即時性要求高的話,使用websocket統計串連數
首先,得確定一下什麼是線上,簡單的做法就是固定時間比如5分鐘內活動的都算線上。
剩下的就簡單咯,記錄一下使用者最後活躍時間(頁面重新整理或者ajax都行),需要統計時count出距離目前時間<=5min的。
記錄Session數量即可
統計session數量,統計時間跨度取決於session生命期。
利用檔案+cookie,迴圈遍曆檔案中cookie個數。 不過既然你有redis,也可以直接用redis 替代檔案讀寫。
php統計線上人數
我們不用cookie和伺服器端session,但剛好有這個需求,最後是用websocket看的,原以為很麻煩,沒想到還挺容易的
我常用的一個方法:
1、 建立一張 mysql 的記憶體表(優秀的讀寫效能以及快速增刪)
CREATE TABLE `xx_session` ( `user_id` INT(10) UNSIGNED NOT NULL DEFAULT '0', `expire` INT(10) UNSIGNED NOT NULL DEFAULT '0', `ip` INT(10) UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (`user_id`), KEY `ip` (`ip`), KEY `expireIndex` (`expire`)) ENGINE=MEMORY DEFAULT CHARSET=utf8
user_id:使用者id
expire:用於告訴系統到期時間
ip:ip2long 轉成的整型ip
附:記憶體表有一個問題,就是重啟後所有資料會消失。這點在使用中請務必注意。
2、使用者每次操作時 replace into 進記憶體表:
REPLACE INTO xx_session (user_id, expire, ip)VALUES(10, 1000000000, 102933800);
3、 使用者退出時:
DELETE FROM xx_session WHERE user_id=10;
4、 線上使用者到期,可以通過 Mysql 的 Event Scheduler 來定時刪除到期使用者:
CREATE DEFINER=`root`@`%` EVENT `30minute` ON SCHEDULE EVERY 30 MINUTE STARTS '2012-05-30 00:00:00' ON COMPLETION NOT PRESERVE ENABLE DO BEGIN DELETE FROM xx_session WHERE expire<= UNIX_TIMESTAMP(); END;
注意:
mysql 要啟用 Event Scheduler:
查看是否啟動:
SELECT @@event_scheduler;
啟動方法1(不重啟,但重啟失效):
SET GLOBAL event_scheduler = 1;
啟動方法2(永久生效),在 mysql 啟動時加上:
mysqld ... --event_scheduler=1
啟動方法3(永久生效),在 my.cnf 中、[mysqld]裡,加入:
event_scheduler=ON