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 !!!!!
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.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 !!!!!
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:
Còn dưới đây là file online.php, giải thích trong code cho tiệnPHP Code:
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 ;
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!PHP Code:
<?
// 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";
?>
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 à?
Được sửa bởi Lê Minh Online lúc 10:59 ngày 24-04-2007 Reason: http://igame.vn/f/showthread.php?t=413
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
thanks bác lê minh online . mình cũng đang mún tìm hiểu cái này .
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 .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
có khi nào bạn vào 1 site 2 tab cùng 1 brower ???
Đế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 .
=> 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ỉ???
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 đó.
"bất khả tri"
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.
Bookmarks