PDA

View Full Version : script PHP đếm số người đang online ?



santasi
29-08-2002, 16:10
Có ai biết script PHP nào đếm số người đang online trên trang của mình không ?, Làm ơn chỉ tôi !!!!!

Lê Minh Online
23-04-2007, 08:21
Có ai biết script PHP nào đếm số người đang online trên trang của mình không ?, Làm ơn chỉ tôi !!!!!
Với PHP mình dùng session: mỗi user visit delete 1 row đồng thời insert 1 session id vào table đó, công việc còn lại chỉ là đếm số session id trong table. Cách này ăn đứt cách dùng theo ip và time để đếm lượng truy cập. Còn không biết yêu cầu của bạn ra sao, nếu mới làm web thì kiếm cái free counter nào đó bỏ vào cho nhanh thấy. :D

concocnho
23-04-2007, 19:53
Với PHP mình dùng session: mỗi user visit delete 1 row đồng thời insert 1 session id vào table đó, công việc còn lại chỉ là đếm số session id trong table. Cách này ăn đứt cách dùng theo ip và time để đếm lượng truy cập. Còn không biết yêu cầu của bạn ra sao, nếu mới làm web thì kiếm cái free counter nào đó bỏ vào cho nhanh thấy. :D
nếu được bạn post code của mình lên cho mọi người tham khảo thì quá tuyệt luôn đó

Lê Minh Online
24-04-2007, 10:56
Xem nào đầu tiên tạo cái table stats với:

id -> PRIMARY KEY nó.
s_time -> thời gian
s_id -> hàm session_id();

mình post luôn cái table này:


CREATE TABLE `stats`
(
`id` int(11) unsigned NOT NULL auto_increment,
`s_time` int(10) NOT NULL,
`s_id` varchar(40) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=129 ;

Còn dưới đây là file online.php, giải thích trong code cho tiện


<?
// Thong tin MySQL, cai nay chac khoi can noi
$server = 'localhost'; // MySQL server
$username = 'username'; // MySQL username
$password = 'password'; // MySQL password
$database = 'stats'; // MySQL database
// ket noi co so du lieu
$connect = mysql_connect("$server", "$username", "$password");
if (!$connect)
{
die("Khong the ket noi den server" . mysql_error());
}
// chon co so du lieu lam viec
mysql_select_db("$database", $connect);

session_start(); // Khoi dong session
$s_id = session_id(); // Bien s_id
$time = time(); // Lay thoi gian hien tai
$time_secs = 3; // Thoi gian tinh bang seconds de delete & insert cai $s_id moi, test tren localhost thi cho no bang 3 seconds de nhanh thay ket qua, chạy trên host thì để 900 = 15 phút là vừa
$time_out = $time - $time_secs; // Lay thoi gian hien tai

@mysql_query("DELETE FROM stats WHERE s_time < '$time_out'"); // Delete tat ca nhung rows trong khoang thoi gian qui dinh san
@mysql_query("DELETE FROM stats WHERE s_id = '$s_id'"); // Delete cai $s_id cua chinh thang nay
@mysql_query("INSERT INTO stats (s_id, s_time) VALUES ('$s_id', '$time')"); // Delete no xong lai insert chinh no
$user_online = @mysql_num_rows(@mysql_query("SELECT id FROM stats")); // Dem so dong trong table stats, chinh la so nguoi dang online
// Them 1 cai, xem page nay da duoc mo bao nhieu lan:
list($page_visited) = @mysql_fetch_array(@mysql_query("SELECT MAX(id) FROM stats"));
// Xong rui, cho no ra thui
echo "Online: <b>".$user_online."</b><br>";
echo "Trang nay duoc mo: <b>".$page_visited."</b> lan";
?>

Mình vừa viết nó, test trên localhost với IE, FF & Opera thấy số online là 3 chắc OK!

Note: http://igame.vn/f/showthread.php?t=413 <- post lên thấy nó, lại kiểu ads mới của DDTH à?

kianh
01-04-2009, 23:55
Trong trường hợp 1 người, trên 1 máy,chạy trên cùng 1 browser và mở 2 tab lên để chạy online.php thì báo số người đang online là 2

ngoc_viet08
02-04-2009, 08:44
thanks bác lê minh online . mình cũng đang mún tìm hiểu cái này .

Trong trường hợp 1 người, trên 1 máy,chạy trên cùng 1 browser và mở 2 tab lên để chạy online.php thì báo số người đang online là 2
:D có lẽ chúng ta ko cần quan tâm để xử lý những trường hợp client dở hơi như thế này .
có khi nào bạn vào 1 site 2 tab cùng 1 brower ??? :D

fotech_nd
02-04-2009, 18:01
Đếm số người đang online - theo em được biết thì PHP làm khá phức tạp (hình như là phức tạp chung đối với các Scripting language thì phải).

Các source-code & ý tưởng của các bạn đã nêu ở trên cũng khá ổn nhưng đều gặp phải một vấn đề đó là phải tốn nhiều query (tối thiểu 2 query cho mỗi lần trang được gọi) -> tốc độ bị chậm, không những thế - vấn đề inefficient cũng ko thể giải quyết triệt để.

Search internet thì thấy có SRM (Script Running Machine - http://www.vl-srm.net) là một project để phát triển một PHP extension để giải quyết vấn đề xử lý trạng thái không được công nhận của giao thức HTTP (statelessness of the HTTP protocol) - cụ thể một vấn đề của nó là làm sao để đếm số người online trong hệ thống - xem tại http://talks.php.net/show/srm-montreal/10. Buồn là từ lúc ý tưởng được đề ra (năm 2000) cho đến giờ nó vẫn chưa có bản stable :D.

=> Túm lại là vẫn chưa có cách giải quyết nào khả thi - ko biết có bác nào có cách giải quyết triệt để ko nhỉ???

jiSh@n
02-04-2009, 18:11
có khi nào bạn vào 1 site 2 tab cùng 1 brower ??? :D

Chuyện này rất bình thường. Bạn đọc news thì bạn mở một lần nhiều tab hay cứ mở mỗi 1 tab. Vào các forum cũng thế, mở nhiều tab hay mở mỗi 1?

superthin
02-04-2009, 18:36
Vấn đề đau đầu là dùng script PHP để tính số người đang Online (thực sự là vừa mới Online gần đó thì đúng hơn - họ đóng trình duyệt lại chưa hẳn nó đã báo họ ra đi ngay mà phải đợi một số thời gian nào đó - nghĩa là chậm hơn ở các hệ thống server CHAT), có hai tình huống xảy ra:

1) Nếu một người dùng mở nhiều Tab hoặc Windows của cùng một trình duyệt khi vào một site / trang (cụ thể là trang ta tính người online) => khả năng PHP đếm làm nhiều người. Nếu PHP phân biệt được khi cùng trình duyệt => dùng 2 trình duyệt khác nhau nó sẽ cũng đếm làm nhiều người.

2) Nếu ta dùng PHP và đếm IP mà loại trừ để 1 IP chỉ tính một người cũng sẽ không ổn. Vì sao? Trường hợp nhiều người cùng một mạng LAN vào trang web của ta thì sao? Họ là nhiều người đấy chứ.

Đó là chưa kể bây giờ có nhiều con bots / nhện của các máy tìm kiếm thường xuyên càn quét qua, ta cũng sẽ đếm những con này là một người truy cập.

Do đó, nếu người dùng không đăng nhập, chỉ là khách viếng thăm thì độ chính xác chỉ là tương đối. Có đúng vậy không mọi người? Không rõ các scrip dạng diễn đàn thông dụng như vBB, phpBB, IPB giải quyết việc này như thế nào nhỉ?

Để mà viết PHP giải quyết được rốt ráo các vấn đề vừa nêu có thể đủ để làm một tiểu luận tốt nghiệp cao đẳng công nghệ thông tin đấy. Và đoạn code đó có lẽ hơi bị nặng, dùng nhúng vào đâu đó để xài cũng hơi bị làm hệ thống thiếu hiệu quả, gặp trang có đông người truy cập là ... cũng tốn tiền thuê host lắm đó.

jiSh@n
02-04-2009, 18:42
Hiện giờ chả có giải pháp đếm số lượng unique visitor nào hoàn toàn chính xác, kể cả việc phân tích log của webserver (như Awstat) vẫn ko chính xác 100% bởi vì lý do nằm từ client chứ ko phải server.

ngoc_viet08
02-04-2009, 21:15
Chuyện này rất bình thường. Bạn đọc news thì bạn mở một lần nhiều tab hay cứ mở mỗi 1 tab. Vào các forum cũng thế, mở nhiều tab hay mở mỗi 1?
ặc , 1 tab, mở 2 tab chi vậy bác. đọc đi đọc lại nhiều lần à ? hay chạy 1 bên ie 1 bên FF để vừa đọc vừa so sánh nội dung ?
vào xem 1 trang web hết tin này thì nhảy sang link khác thì cũng 1 tab chứ rảnh quá đi mở thêm tab với nội dung y chang chy vậy ?

jiSh@n
02-04-2009, 21:54
ặc , 1 tab, mở 2 tab chi vậy bác. đọc đi đọc lại nhiều lần à ? hay chạy 1 bên ie 1 bên FF để vừa đọc vừa so sánh nội dung ?
vào xem 1 trang web hết tin này thì nhảy sang link khác thì cũng 1 tab chứ rảnh quá đi mở thêm tab với nội dung y chang chy vậy ?

Chả khùng đến mức mở nhiều tab cùng 1 nội dung. Bạn nghĩ 1 website chỉ có duy nhất 1 trang à?

Mà cũng công nhận bạn hơi khác người, đọc news thì người ta mở chừng chục tab rồi đọc hết tab này đến tab khác chứ chả mấy ai ngồi click và đợi load như bạn cả. ;)

ngoc_viet08
02-04-2009, 22:03
Chả khùng đến mức mở nhiều tab cùng 1 nội dung. Bạn nghĩ 1 website chỉ có duy nhất 1 trang à?

Mà cũng công nhận bạn hơi khác người, đọc news thì người ta mở chừng chục tab rồi đọc hết tab này đến tab khác chứ chả mấy ai ngồi click và đợi load như bạn cả.
hì . mình thì nghĩ khác . đa số người ta mở nhiều tab , nhiều brower lúc để đọc từ nhiều site khác nhau . mỗi site 1 tab hoặc 1 brower window . chứ chẳng ai rảnh để vào cùng 1 site bởi nhiều tab rồi click mỗi tab 1 bài viết rồi ngồi đọc a->b->c cả .
:D website mà chậm đến mức việc ngồi đợi nó load cũng đáng để kể thì bạn sẽ chẳng ghé nó lần thứ 2 .
:D mà thôi , chuyện này bàn luận nhảm nhí quá . ý kiến mình với bạn khác nhau rồi , đừng cãi mất công thiên hạ cười cho . dù sao nói chuyện ko có chứng thực thì cũng nên tôn trọng nhau 1 tí .

jiSh@n
02-04-2009, 23:02
hì . mình thì nghĩ khác . đa số người ta mở nhiều tab , nhiều brower lúc để đọc từ nhiều site khác nhau . mỗi site 1 tab hoặc 1 brower window . chứ chẳng ai rảnh để vào cùng 1 site bởi nhiều tab rồi click mỗi tab 1 bài viết rồi ngồi đọc a->b->c cả .
:D website mà chậm đến mức việc ngồi đợi nó load cũng đáng để kể thì bạn sẽ chẳng ghé nó lần thứ 2 .
:D mà thôi , chuyện này bàn luận nhảm nhí quá . ý kiến mình với bạn khác nhau rồi , đừng cãi mất công thiên hạ cười cho . dù sao nói chuyện ko có chứng thực thì cũng nên tôn trọng nhau 1 tí .
Cái này thì bạn nhầm lol
Vào trang báo điện tử, các tin chỉ gồm tiêu đề (+link) và 1 đoạn ngắn. User thường mở nhiều tab từ các link tiêu đề này, và trong lúc họ đọc 1 tab thì các tab còn lại vẫn đang load, đọc hết tab 1 thì tab 2 đã load xong, đóng tab 1 là nội dung tab 2 sẽ hiện ra để sẵn sàng đọc tiếp, hoặc đọc xong tab 1 thì thấy 1 vài tin trong old/related news mà mình chưa đọc thì học sẽ đọc tiếp trong tab đó, tạo ra 1 mạch đọc liên tục ... Còn như bạn, đọc xong 1 tin, phải back lại, rồi mở tin mới ra đọc, xong lại phải back... Người ta chọn cách tiện lợi cơ ;)

Chính vì vậy mà tính năng tab của các trình duyệt hầu hết đều để mặc định là mở tab mới ở background ;)

boylove_n3t
16-02-2011, 08:48
Cái này thì bạn nhầm lol
Vào trang báo điện tử, các tin chỉ gồm tiêu đề (+link) và 1 đoạn ngắn. User thường mở nhiều tab từ các link tiêu đề này, và trong lúc họ đọc 1 tab thì các tab còn lại vẫn đang load, đọc hết tab 1 thì tab 2 đã load xong, đóng tab 1 là nội dung tab 2 sẽ hiện ra để sẵn sàng đọc tiếp, hoặc đọc xong tab 1 thì thấy 1 vài tin trong old/related news mà mình chưa đọc thì học sẽ đọc tiếp trong tab đó, tạo ra 1 mạch đọc liên tục ... Còn như bạn, đọc xong 1 tin, phải back lại, rồi mở tin mới ra đọc, xong lại phải back... Người ta chọn cách tiện lợi cơ ;)

Chính vì vậy mà tính năng tab của các trình duyệt hầu hết đều để mặc định là mở tab mới ở background ;)
Rất hợp lý, từ lúc mới dùng FF hồi xưa hồi xưa mình đã làm như thế, chỉ có mấy tên cùi cùi chỉ biết xài mỗi IE6 mới làm cái cách Back back đó thôi ;))