วิธีนับ User Online อย่างง่าย by

30
Nov
1

ปกติการนับ User Online มักจะทำด้วยการ insert ลง database และนับเวลาเอา แต่ว่าวันนี้ผมมีวิธีนับ User Online อย่างง่ายมาให้ครับ โดยจะใช้การนับจาก Session ที่สร้างขึ้นจาก session_start(); แทน โดยในหลักการแล้วข้อมูล session ก็คือการสร้างไฟล์ text ไฟล์หนึ่งเก็บเอาไว้ใน server และผู้ใช้แต่ละคนจะมี session id ของตัวเองมาเพื่อร้องขอข้อมูลตรงนี้ไปใช้งาน ซึ่งการเก็บข้อมูลลงไฟล์จะเป็นในลักษณะ 1 คนต่อ 1 ไฟล์อยู่แล้ว หลักการเราก็เพียงแค่นับจำนวนไฟล์ในขณะนั้นทั้งหมดก็พอ หากผู้ใช้คนใดเลิกใช้งานไปสักระยะหนึ่งไฟล์จะถูกลบไปเอง จึงสามารถนำมาคำนวณ User Online ได้อย่างที่ต้องการ
พอดี code ที่ใช้งานมีดังนี้

<?php
/* Start the session */
session_start(); 

/* Define how long the maximum amount of time the session can be inactive. */
define("MAX_IDLE_TIME", 3); 

function getOnlineUsers(){ 

	if ( $directory_handle = opendir( session_save_path() ) ) {
		$count = 0;
		while ( false !== ( $file = readdir( $directory_handle ) ) ) {
			if($file != '.' && $file != '..'){
				// Comment the 'if(...){' and '}' lines if you get a significant amount of traffic
				//if(time()- fileatime(session_save_path() . '\\' . $file) < MAX_IDLE_TIME * 60) {
					$count++;
				//}
			} 

		}
		closedir($directory_handle); 

		return $count;
	} else {
		return false;
	}
} 

echo 'Number of online users: ' . getOnlineUsers() . "\n";
?>

MAX_IDLE_TIME คือเวลาหน่วยเป็นนาทีว่าจะนับเฉพาะ session ที่ถูกสร้างมาภายในกี่นาที หากต้องการเวลาที่แม่นยำให้ระบุตรงนี้และเอา comment //if(time()- fileatime(session_save_path() . ‘\\’ . $file) < MAX_IDLE_TIME * 60) ออกด้วย

หากคุณเช่า hosting อยู่และไม่ได้เช่าเครื่องเฉพาะเป็นของตัวเองโดดๆ จะต้องระบุ

session_save_path(“/path/to/custom/directory”);

เพิ่มเข้าไปด้วย เป็นการระบุ path ที่จะเก็บไฟล์ session เอง เพื่อจะให้ไม่ปนกับเว็บไซต์อื่นที่ Host อยู่เครื่องเดียวกับเรา

เพียงเท่านี้คุณฃก็จะได้วิธีนับ User Online มาโดยไม่ต้องเขียนระบบด้วย database วุ่นวายครับ แถม performance ยังดีกว่าการใช้ database อีกด้วย แต่วิธีนี้ก็มีข้อเสียอยู่เหมือนกันคือหากต้องการนับเฉพาะหน้าหรือต้องการรายละเอียดปลีกย่อยกว่านี้เช่นนับเฉพาะคนใช้ IE จะไม่สามารถทำได้ ต้องใช้ database เขียน code เอาเองครับ