เมื่อสร้างเว็บไซต์เพื่อการสื่อสารออนไลน์มีปัญหาที่ทำให้ปวดหัวคือเกี่ยวกับสถิติผู้ใช้ออนไลน์แบบเรียลไทม์ที่ลูกค้าต้องการ: การนับจำนวนคนออนไลน์ในปัจจุบัน, จำนวนผู้เยี่ยมชม, จำนวนสมาชิก และรายชื่อผู้ใช้ออนไลน์ รวมถึงผู้เยี่ยมชม สมาชิก และสมาชิกผู้บริหาร (หากเป็นผู้เยี่ยมชม ID ของผู้เยี่ยมชมจะถูกสร้างขึ้นโดยอัตโนมัติ หากเป็นสมาชิก ชื่อของสมาชิกจะปรากฏขึ้น) เนื่องจากต้องใช้ประสิทธิภาพแบบเรียลไทม์ ก่อนอื่นฉันจะส่งต่อแนวคิดในการใช้ global.asa เพื่อแก้ปัญหา
กุญแจสำคัญของปัญหาคือวิธีการตรวจสอบว่าผู้ใช้ออกไปแล้ว และวิธีการเรียกใช้งานไฟล์หรือฟังก์ชันเมื่อผู้ใช้ออกไป
หลังจากที่ได้พูดคุยกับเพื่อนๆ บนอินเทอร์เน็ต ในที่สุดฉันก็สามารถแก้ไขปัญหานี้ได้
หลักการแก้ปัญหาคือ: เขียนหน้าสากล ที่เรียกว่าหน้าสากลหมายความว่าทุกหน้าในแอปพลิเคชันมีหน้านี้ เช่น header.asp ในหน้านี้ ให้เขียนโค้ดโดยใช้ XMLHTTP รหัสคือ คำขอจะถูกส่งไปยังเซิร์ฟเวอร์ทุกๆ 10 วินาทีหรือ 20 วินาที โดยมีวัตถุประสงค์เพื่ออัปเดตเวลาออนไลน์ของผู้ใช้ปัจจุบันและลบผู้ใช้ที่เวลาออนไลน์เกินเวลาที่กำหนด เพื่อให้ผู้ใช้ออนไลน์บันทึกในฐานข้อมูลคงไว้ซึ่งความเป็นจริงที่แน่นอน -ธรรมชาติของกาลเวลา
วิธีการดำเนินการหลักคือ:
สร้างฐานข้อมูลใหม่ ชื่อฟิลด์คือ: id (อักขระ), ชื่อ (อักขระ), ผู้ใช้ (หมายเลข) tt (วันที่), ผู้ดูแลระบบ (รหัสผู้มีอำนาจ, ผู้ใช้ 0 ปกติ, ผู้ดูแลระบบ
1 คน)
ชื่อ:ออนไลน์
header.asp ↓
=========================================== === ================
<%
... ...
ถ้า session("s_in")<>1 และ session("s_name")="" แล้ว 'ถ้า ผู้ใช้จะทำการ Log in หนึ่งครั้งเพื่อ
rs.open "select * from online",conn,3,3
rs.เพิ่มใหม่
rs("id")=session.sessionID
rs("name")="แขก" & session.sessionID
rs("user")=0 '0 หมายความว่าผู้ใช้ไม่ได้เข้าสู่ระบบและเป็นผู้เข้าชม
rs("tt")=ตอนนี้
อาร์เอสอัปเดต
฿.ปิด
session("s_in")=1 'ตั้งค่าข้อมูลของผู้ใช้ถูกเก็บไว้ในฐานข้อมูล โดยระบุว่าออนไลน์อยู่
สิ้นสุด if
if session("s_name"<>"" ดังนั้น 'หากผู้ใช้เข้าสู่ระบบผ่านกล่องเข้าสู่ระบบ
rs.open "เลือก * จากออนไลน์โดยที่ id='" & session.sessionID & "'",conn,3,3
rs("name")=session("s_name")
rs("admin")=session("s_admin") 'อัพเดตชื่อผู้ใช้เป็นชื่อสมาชิก
rs("user")=1 'แสดงว่าผู้ใช้ได้เข้าสู่ระบบและเป็นสมาชิกแล้ว
rs("tt")=now 'ตั้งเวลาระบบปัจจุบันเป็นเวลาเข้าสู่ระบบของผู้ใช้
อาร์เอสอัปเดต
฿.ปิด
สิ้นสุดถ้า
... ...
%>
... ...
<head>
... ...
<script language=javascript>
ฟังก์ชั่นทดสอบ()
-
var xmlhttp = ใหม่ ActiveXObject("MSXML2.XMLHTTP");
xmlhttp.open("POST", "onceonline.asp",false); //ส่งคำขออัปเดตไปที่ onesonline.asp
xmlhttp.setRequestHeader("ประเภทเนื้อหา", "application/x-www-form-urlencoded");
xmlhttp.send();
-
setInterval("Test();",10); //ส่งคำขออัปเดตทุกๆ 10 วินาที
</script>
... ...
</head>
... ...
============================== ============================
oneonline.asp
<%
rs.open "เลือก tt จากออนไลน์โดยที่ id='" & session.sessionID & "'",conn,3,3
rs("tt")=now() 'อัปเดตเวลาออนไลน์ของผู้ใช้ออนไลน์ปัจจุบัน
อาร์เอสอัปเดต
rs.close
rs.open "ลบจากออนไลน์ โดยที่ datediff('s',tt,now())>60",conn,3,1 'ลบผู้ใช้ที่หมดเวลา
%>
================================================ ==============
ด้วยวิธีนี้ โดยทั่วไปรับประกันลักษณะของรายชื่อผู้ใช้ในฐานข้อมูลแบบเรียลไทม์ ข้อผิดพลาดขึ้นอยู่กับความแตกต่างระหว่างเวลาอัปเดตและเวลาในการลบและ ความเร็วในการประมวลผลของเซิร์ฟเวอร์ ขอแนะนำไม่ให้หมดเวลาการลบ หากช่วงเวลาระหว่างผู้ใช้น้อยเกินไป อาจทำให้เกิดข้อผิดพลาดในหมู่ผู้ใช้ออนไลน์
โซลูชันนี้ได้รับการดีบั๊กบน WIN2000+SQL Server2000 เนื่องจากโซลูชันนี้มีข้อกำหนดของระบบที่ค่อนข้างใหญ่ ฉันหวังว่าเพื่อน ๆ คนอื่นๆ จะคิดวิธีแก้ปัญหาที่ดีกว่านี้และแก้ไขปัญหานี้ร่วมกัน!
กล่องจดหมายของฉัน: [email protected]
ฉันชื่อ "Building Blocks" คุณสามารถเป็นเพื่อนกับฉันได้!