Thường thì khi người dùng truy cập vào website sẽ có thông tin về địa chỉ IP và một vài thông tin khác (như thông tin về trình duyệt mà họ sử dụng), sau đó, nếu họ đăng nhập bằng tài khoản thì ta có thêm thông tin về thành viên này.
$username = empty($_GET['usn'])?$_SERVER['REMOTE_ADDR']:$_GET['usn'];
đoạn code trên tôi giả sử user đăng nhập vào là giá trị được nhập từ URL, $_SERVER['REMOTE_ADDR'] là địa chỉ IP của máy client. Nó có nghĩa là nếu chưa có thông tin về thành viên thì lấy địa chỉ IP của người dùng đó.
Sau đó, chúng ta cần một đoạn mã javascript để request về server thông tin mà ta có được về thành viên này để server xử lý:
var data = {'username':'<?php echo $username?>'};
$(document).ready(function(){
setInterval(function(){
$.ajax({
url: 'counter.php',
type: 'POST',
data: {'username':data.username},
dataType: 'json',
success: function(data){
var xhtml = "";
$('.online').html(data.total);
$.each(data, function(i, item){
if(i != 'total'){
xhtml += '<li>'+item+'</li>';
}
});
$('ul.list').html(xhtml);
},
error: function(XMLHttpRequest, textStatus, errorThrown){
//làm gì nhỉ?
}
});
}, 1000);//Request sau 1s
});
Với đoạn mã trên, nó sẽ request về server (cụ thể là tập tin counter.php) liên tục 1 giây 1 lần, nó gửi thông tin về username, và nhận thông tin phản hồi từ server về số lượng người đang truy cập và danh sách các thành viên đang truy cập, gán vào các thẻ HTML mà ta đã có trước:
<div style="border:1px solid #ccc;padding 10px;width: 79px;">
Online: <span class="online"> </span>
</div>
<div class="olist">List:
<ul class="list"></ul>
</div>.
Như vậy, nội dung counter.php cần có những gì?
function Online($params) {
$folder = 'counter';
if(!is_dir($folder)) mkdir($folder, 0777); // Tạo thư mục counter nếu chưa có
//Tạo file khi có thành viên mới
//$visiter = md5($params['user']);//mã hóa filename
$filename = $folder.'/'.$params['user'].'.onl';
$f = fopen($filename, "w");
fwrite($f, '');
fclose($f);
$online = array();
$online['total'] = 0;
$current_time = time();
$timeout = 5;//60 = 1 minute => đếm trong vòng 5s
//Load danh sách các file đã được tạo
$flist = scandir($folder);
foreach($flist as $num => $file) {
$filer = $folder.'/'.$file;
if(substr($filer, strrpos($filer, '.') + 1) == 'onl') {
$ftime = filemtime($filer);
if ($current_time - $ftime > $timeout) unlink($filer);// Xóa file
else{
$online[] = preg_replace("#\.onl#","",$file);
$online['total']++;
}
} }
return $online;
}
$params = array('user'=>$_POST['username']);
$result = Online($params);
echo json_encode($result);
Hàm Online nhận một tham số $params có chứa giá trị là thông tin người truy cập, trả về số lượng người đang truy cập cùng với danh sách những thành viên đang truy cập.
Hàm này tạo ra một file với tên là tên của thông tin thành vên đó, sau đó nó lấy toàn bộ các file trong thư mục counter, kiểm tra các file đã hết hạn để xóa nó đi, nếu chưa hết hạn thì tiến hành đếm và lấy thông tin các thành viên khác
Sau khi hoàn tất xử lý, ta dùng hàm json_encode mà PHP hỗ trợ sẵn để tạo đối tượng chứa thông tin trên, gửi về cho client.
Không có nhận xét nào:
Đăng nhận xét