PDA

View Full Version : Xem có bao nhiêu người đang online trong forum



cuongdh
22-04-2005, 08:33
Mình đang viết 1 forum = PHP, làm thế nào để biết có bao nhiêu người đang online trong forum?

gamer1
23-04-2005, 20:26
Mình chưa viết thử forum bằng PHP nhưng cũng có ý tưởng chút ít về câu hỏi của bạn.
Giả sử bảng thành viên có trường status chỉ trạng thái của người đang on/off line.
Giả sử 0 là offline, 1 là online. Ai đăng nhập(login) vào thì bạn gán status là 1. Vậy thì khi muốn hiển thị số người đang online chỉ cần dùng 1 lệnh sql
select count(*) from thanhvien where status=1;

tdhoang
23-04-2005, 21:58
Giả sử 0 là offline, 1 là online. Ai đăng nhập(login) vào thì bạn gán status là 1. Vậy thì khi muốn hiển thị số người đang online chỉ cần dùng 1 lệnh sql
select count(*) from thanhvien where status=1;

----------

Khi người dùng đã quit rồi thì sao ? Có cách nào để set status lại off không ?Nếu không sau 1 thời gian thì status đều = online hết ?

itgatevn
24-04-2005, 02:27
Mình có ý này nhé

dùng ipaddress , timer, và userid để nhận biết số người online,

- một người guest truy cập sẽ có ipaddress
- nếu đăng nhập thành công tức là member -> sẽ có userid
- nếu mà sau thời gian để tính online (ví dụ 5 phút) nếu mà người đó không sử dụng nữa -> delete cái row này là xong.

không biết ý kiến này có được không?

thân chào

gamer1
24-04-2005, 08:59
----------

Khi người dùng đã quit rồi thì sao ? Có cách nào để set status lại off không ?Nếu không sau 1 thời gian thì status đều = online hết ?

Khi người dùng logout theo đúng quy định( bấm vào logout) thì mình gán lại status của họ là 0 trước khi unregister các biến session. Tuy nhiên khi họ tắt cửa số trình duyệt luôn thì sao nhỉ, mình thử ở ddth thì thấy nick vẫn có trong danh sách online...mặc dù chưa đăng nhập.

tdhoang
24-04-2005, 10:58
Mình có ý này nhé

dùng ipaddress , timer, và userid để nhận biết số người online,

- một người guest truy cập sẽ có ipaddress
- nếu đăng nhập thành công tức là member -> sẽ có userid
- nếu mà sau thời gian để tính online (ví dụ 5 phút) nếu mà người đó không sử dụng nữa -> delete cái row này là xong.

không biết ý kiến này có được không?

thân chào

Cách của bạn cũng gần đúng rồi. Có điều làm sao để biết người đó có xử dụng nữa hay không sau 5 phút ? Bạn cần phải update table liên tục nếu ngừoi đó còn search around website bạn. Với 1 forum hay website đông người xử dụng thì server chạy rất nặng.

Thông thừơng thì mình dùng session để check. Mỗi người log vào thường có 1 session khác nhau, và session sẽ tồn tại nếu người đó còn xử dụng website mình trong thời gian nào đó. Còn nếu để lâu session sẽ tự expired. Như vậy bạn chỉ cần store session id 1 lần vào table rồi mỗi khi có người login thì check coi session có bị expired chưa, không phải update nhiều lần. Nếu kết hợp session và IP thì kết quả chính xác hơn. Nhưng trong trường hợp forum thì không cần thiết, vì mỗi user chỉ được log in 1 lần nên không thể mang 2 sessions 1 lúc được.

ohyesssvn
24-04-2005, 11:36
Cách của bạn cũng gần đúng rồi. Có điều làm sao để biết người đó có xử dụng nữa hay không sau 5 phút ? Bạn cần phải update table liên tục nếu ngừoi đó còn search around website bạn. Với 1 forum hay website đông người xử dụng thì server chạy rất nặng.

Thông thừơng thì mình dùng session để check. Mỗi người log vào thường có 1 session khác nhau, và session sẽ tồn tại nếu người đó còn xử dụng website mình trong thời gian nào đó. Còn nếu để lâu session sẽ tự expired. Như vậy bạn chỉ cần store session id 1 lần vào table rồi mỗi khi có người login thì check coi session có bị expired chưa, không phải update nhiều lần. Nếu kết hợp session và IP thì kết quả chính xác hơn. Nhưng trong trường hợp forum thì không cần thiết, vì mỗi user chỉ được log in 1 lần nên không thể mang 2 sessions 1 lúc được.


Không đúng đâu bạn ơi, cái này mình có đọc ở diễn đàn nào khác rồi nhưng không nhớ. Bởi vì bạn chỉ check có online không khi thấy cần thiết, ví dụ như check ở trang index của diễn đàn này, hoặc ở các thread thì chỉ check những ai có bài viết ở thread đó nên việc check chỉ thực hiện ở những trang này thôi. Thêm nữa là ở mỗi user có 1 trường ghi lại thời gian của hoạt động cuối cùng do đó ở những trang này (index hoặc các threads) chỉ check thời gian hiện tại trừ đi thời gian mà họ có hành động cuối cùng trong website coi có nhỏ hơn thời gian bạn đặt để check online không (vd 5 phút).

Còn xóa session thường thì là 20 phút (theo mặc định) nên thường không chính xác, còn nếu bạn đặt thời gian mặc định ngắn lại thì gây bất tiện cho người dùng và làm nặng tải của server.

Viết có vẻ dài dòng hơi khó hiểu

tdhoang
25-04-2005, 04:50
Theo mình, thời gian không phải là vấn đề của counter, tùy thuộc vào website có cần security hay webmaster thích set time như thế nào.

Vấn đề ở đây là tránh server phải chạy update không cần thiết. Hãy lấy 1 thí dụ để dễ hiểu hơn: lúc 10 giờ, 1 user log in vào thì bạn log người đó vào table Login chẳng hạn(giả sử expired time là 5 phút)

- Lúc 10:03, người đó click vào 1 chỗ nào khác. Nếu không dùng session, thì program sẽ check lại table Login, rồi update time access (như vậy người đó sẽ tồn tại tới 10:08)
- Lúc 10:06, người đó lại click vào 1 chỗ khác, và program lại check table login và update lần nữa ... Cứ check và update như vậy mỗi khi user click.
- Theo ý bạn là không cần thiết update khi user hoạt động, thì lúc 10:06 user đó đã đã coi như không tồn tại nữa rồi cho dù lúc 10:03, user vẫn còn xử dụng...

Nhưng xử dụng session thì program không phải làm việc nhiều, vì session tự update khi user còn click vào chỗ nào đó. Program chỉ check session có expired hay không mà thôi không cần biết lần cuối người đó hoạt động trên website là lúc nào.

ohyesssvn
25-04-2005, 08:13
Cách làm của bạn có 1 số vấn đề sau đây:

-Bạn dùng session để kiểm tra, nếu session hết hạn thì có nghĩa là người đó không còn online. Nhưng thời gian để session hết hạn thường là dài (20'). Điều đó có nghĩa là nếu 19' truớc đây người đó không có hoạt động nào trong website nhưng vẫn đuợc coi là online?
-Nếu bạn giảm thời gian hết hạn của session xuống để kiểm tra cho chính xác hơn (vd 5') thì 1 người nào đó đọc bản tin dài hơn 5 phút tự động bị coi là đã chấm dứt hoạt động tại website và bị buộc login lại.

-Điều quan trọng nữa là mình không biết có cách nào kiểm tra session của người khác còn hay không trừ phi bạn tự quản lý vấn đề ghi session cho riêng mình.

tdhoang
25-04-2005, 10:29
Cách làm của bạn có 1 số vấn đề sau đây:

-Bạn dùng session để kiểm tra, nếu session hết hạn thì có nghĩa là người đó không còn online. Nhưng thời gian để session hết hạn thường là dài (20'). Điều đó có nghĩa là nếu 19' truớc đây người đó không có hoạt động nào trong website nhưng vẫn đuợc coi là online?

-Nếu bạn giảm thời gian hết hạn của session xuống để kiểm tra cho chính xác hơn (vd 5') thì 1 người nào đó đọc bản tin dài hơn 5 phút tự động bị coi là đã chấm dứt hoạt động tại website và bị buộc login lại.

Như mình đã nói, điều này không quan trọng. Không có counter nào display chính xác số người đang hiện diện online. Với mình, sự hiện diện của người đã log out trong vòng 5,7 hay 10 phút trước không cần thiết lắm. Ngoại trừ trường hợp bạn muốn dùng chat thì phải refresh thường xuyên.



-Điều quan trọng nữa là mình không biết có cách nào kiểm tra session của người khác còn hay không trừ phi bạn tự quản lý vấn đề ghi session cho riêng mình.

Không hiểu ý bạn muốn nói gì ? Sessions là do program mà web developer viết trên server kiểm soát, bạn hay người nào khác không thể control được.

ohyesssvn
25-04-2005, 11:14
Không hiểu ý bạn muốn nói gì ? Sessions là do program mà web developer viết trên server kiểm soát, bạn hay người nào khác không thể control được.

Vấn đề là ở đây, làm sao bạn lấy đuợc session ID của người khác, kiểm tra coi session đó còn hết hết hiệu lực.

Nếu có thể bạn có thế cho mình xem code của bạn được không