Thứ Ba, 2 tháng 7, 2013

Đếm thành viên online

Như các ban đã biết hiện nay việc đếm số lượng người truy cập đang được rất nhiều website sử dụng. Tuy nhiên việc đếm có chuẩn xác hay không thì chỉ có người lập trình mới có thể biết rõ được. Vấn đề về lập trình như thế nào thì tôi ko bàn tới, mà chỉ muốn giới thiệu đến các bạn cách để tạo ra một bộ đếm trên website.

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">&nbsp;</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

Học lập trình web căn bản với PHP

Bài 1: Các kiến thức căn bản Part 1:  https://jimmyvan88.blogspot.com/2012/05/can-ban-lap-trinh-web-voi-php-bai-1-cac.html Part 2:  https://...