ทุกคนที่เขียน ASP ที่ใหญ่กว่าเล็กน้อยรู้ว่าเซสชันมีประโยชน์จริงๆ แต่คุณรู้หรือไม่ว่าเซสชั่นทำงานอย่างไร? บางทีหลังจากที่คุณเข้าใจคุณจะไม่กล้าที่จะใช้วัตถุที่เกลียดชังความรักนี้อีกครั้ง แม้ว่าวิธีการเปลี่ยนเป็นทางเลือกนั้นค่อนข้างลำบากหลังจากการพิจารณาระยะยาว แต่ฉันต้องทำเช่นนั้น
ก่อนอื่นให้พูดคุยเกี่ยวกับประโยชน์ของเซสชันซึ่งสามารถใช้ในการบันทึกตัวแปรข้อมูลที่ลูกค้าเป็นเจ้าของโดยเอกชนและจะไม่หายไปภายในช่วงเวลา นี่เป็นฟังก์ชั่นที่สำคัญจริงๆโดยเฉพาะอย่างยิ่งระบบที่ต้องใช้กับสมาชิก ตัวอย่างเช่นบัญชีล็อกอินของสมาชิกเวลาสถานะและข้อมูลเรียลไทม์จำนวนมากที่บันทึกไว้ (เช่นระบบช็อปปิ้งบันทึกผลิตภัณฑ์ในตะกร้าช้อปปิ้งของผู้ใช้) ข้อมูลนี้เป็นความต้องการส่วนตัวของผู้ใช้แต่ละคน มัน
อย่างไรก็ตามเซสชันใน ASP ประกอบด้วยคุกกี้และเซิร์ฟเวอร์ส่งข้อมูลทั้งหมดที่บันทึกไว้ในเซสชันไปยังเบราว์เซอร์ของผู้ใช้ในรูปแบบของคุกกี้ โดยปกติแล้วเบราว์เซอร์จะบันทึกคุกกี้เหล่านี้ นี่คือหลักการปฏิบัติการของเซสชัน กำหนดค่าหน่วยความจำใหม่ ฯลฯ การดำเนินการเบื้องต้น ตอนนี้คุณอาจคิดว่า "ฉันต้องใช้ฟังก์ชั่นนี้ดังนั้นฉันต้องเสียสละเล็กน้อย" อย่างไรก็ตามบทความนี้พูดถึงเซสชั่น มีทางเลือกอื่น
แอปพลิเคชันยังดีในการบันทึกและประมวลผลข้อมูลชั่วคราว แอปพลิเคชันไม่เหมือนเซสชันซึ่งไม่ผ่านข้อมูลไปยังผู้ใช้และรอครั้งต่อไปเพื่ออ่านกลับออนไลน์
เนื่องจากวัตถุแอปพลิเคชันเป็นสาธารณะสิ่งแรกที่ต้องทำคือการวางแผนพื้นที่ส่วนกลางสำหรับผู้ใช้แต่ละคนเพื่อให้ผู้ใช้แต่ละคนมีพื้นที่ของตัวเองในการบันทึกข้อมูลเพื่อให้บรรลุวัตถุประสงค์ของเซสชันการจำลอง มีสองวิธีในการทำตอนนี้:
1. เริ่มต้นและจัดสรรพื้นที่หน่วยความจำผู้ใช้ล่วงหน้าเมื่อเปิดใช้งานเซิร์ฟเวอร์ . อย่างไรก็ตามมีข้อ จำกัด โปรแกรมขนาดเล็กเช่นห้องสนทนา
2. วิธีนี้ควรได้รับการพิจารณาว่าเหมาะสมกว่าสำหรับแอปพลิเคชันขนาดใหญ่ วัตถุประสงค์ของการแก้ปัญหาเซสชันสองครั้งนี้คือการลดการใช้ทรัพยากรเซสชัน แต่หลังจากทั้งหมดมันยังคงไม่สามารถถูกแทนที่ได้
■แผนแรก
ก่อนอื่นเราเริ่มการใช้งานโซลูชันแรก
การเริ่มต้นเสร็จสมบูรณ์แล้ว แต่จะใช้อย่างไร? เราเพียงแค่ต้องเปลี่ยนข้อมูลที่เก็บไว้ในเซสชันเช่นบัญชีและเวลาเข้าสู่ระบบลงในวัตถุแอปพลิเคชันที่เราสร้างขึ้นซึ่งผู้ใช้เข้าสู่ระบบ:
| 'กำลังมองหาพื้นที่ที่ไม่ได้ใช้ สำหรับ i = 1 ไปยังแอปพลิเคชัน (clientmax) ถ้าแอปพลิเคชัน (user_status_ & i) = 0 แล้ว 'หมายเลขผู้ใช้ชั่วคราว เซสชัน (ดัชนี) = i 'ล็อค แอปพลิเคชันแอปพลิเคชันล็อค 'ตั้งค่าเป็นสถานะที่ใช้แล้ว แอปพลิเคชัน (user_status_ & i) = 1 'ใส่ลงในข้อมูลตัวแปร แอปพลิเคชัน (user_account_ & i) = บัญชี แอปพลิเคชัน (user_logtime_ & i) = ตอนนี้ () 'ปลดล็อค application.unlock ออกจาก สิ้นสุดถ้า ต่อไป |
เพื่อให้ได้ข้อมูลตัวแปรที่เกี่ยวข้องของผู้ใช้มันเป็นเหมือนสิ่งต่อไปนี้:
| Response.write (แอปพลิเคชัน (user_account_ & เซสชัน (ดัชนี)) |
คุณอาจพบว่าคุณไม่ได้หมายความว่าจะไม่ใช้เซสชัน? แล้วทำไมเซสชันจึงมีอยู่ในรหัสต้นฉบับด้านบน? ดังที่ได้กล่าวไว้ก่อนหน้านี้ทางเลือกนี้ไม่สามารถแทนที่เซสชันได้ ในเวลานี้เราต้องพึ่งพาเซสชัน . คุณมีกุญแจและกุญแจสำคัญคือมีตัวเลขอยู่และหมายเลขในคีย์ช่วยให้ผู้ฝึกสอนนำคุณไปสู่ความปลอดภัยของคุณเอง วิธีนี้มีการปรับปรุงบางอย่าง แต่ก็เพียงพอสำหรับแอปพลิเคชันขนาดเล็ก
■แผนครั้งที่สอง
เกี่ยวกับโซลูชันก่อนหน้านี้คุณอาจคิดว่าหมายเลขที่กำหนดเองของเราใช้เซสชันเพื่อบันทึก ถูกต้องไม่ว่าเราจะใช้หรือไม่ก็ตามเซิร์ฟเวอร์จะช่วยให้ผู้ใช้แต่ละคนกำหนดหมายเลขโดยอัตโนมัติและหมายเลขนี้จะไม่ถูกทำซ้ำ การกำหนดหมายเลขนี้เป็นการกระทำที่เซสชันจะทำอย่างแน่นอนดังนั้นเราสามารถใช้มันเพื่อแทนที่โปรแกรมการนับที่เราเขียนเองซึ่งช่วยประหยัดความพยายามอีกครั้งและยังมีการขยายตัวมากขึ้น แต่โดยพื้นฐานแล้วโซลูชันแรกข้างต้นยังคงมีประโยชน์เช่นห้องแชทที่ จำกัด จำนวนผู้คนและแอปพลิเคชันขนาดเล็กอื่น ๆ
หากเว็บไซต์ที่มีผู้คนหลายร้อยคนหลายพันคนหรือหลายหมื่นคนบนเว็บไซต์ทุกวินาทีมันจะไม่ทำงานอย่างแน่นอนหากใช้โซลูชันก่อนหน้า สมมติว่าคุณตั้งค่าขีด จำกัด สูงสุดของ 10,000 คนเมื่อเปิดใช้งานเซิร์ฟเวอร์มันจะช่วยให้คุณตัดพื้นที่ 10,000 แห่งเพื่อเตรียมความพร้อมสำหรับผู้ใช้ 10,000 คน มันมีเพียง 320,000 K (320MB) ไม่กี่คนที่ฉันคิดว่า 512MB ของคุณเองจะเพียงพอ ดังนั้นวิธีแก้ปัญหาคือการกำหนดค่าพื้นที่ตัวแปรผู้ใช้แบบไดนามิกและตัดชิ้นส่วนของพื้นที่เมื่อผู้ใช้ออนไลน์กับเซิร์ฟเวอร์ดังนั้นจึงไม่จำเป็นต้องกำหนดค่าหน่วยความจำขนาดใหญ่ล่วงหน้า
ทางออกที่สองนั้นค่อนข้างง่าย
| 'ล็อค ApplicationApplication.lock' ใส่ข้อมูลตัวแปร แอปพลิเคชัน (user_account_ & session.sessionId) = บัญชี แอปพลิเคชัน (user_logtime_ & session.sessionId) = ตอนนี้ () 'ปลดล็อกแอปพลิเคชันปลดล็อค unlock |
เพื่อให้ได้ข้อมูลตัวแปรที่เกี่ยวข้องของผู้ใช้มันเป็นเหมือนสิ่งต่อไปนี้:
| Response.write (แอปพลิเคชัน (user_account_ & session.sessionId))) |
ในอดีตฉันอ่านหนังสือหลายเล่มที่กล่าวว่าเซสชั่นเป็นเรื่องยากมากที่จะกินทรัพยากรดังนั้นพยายามอย่าใช้พวกเขา แต่ฉันยังต้องใช้พวกเขาเมื่อพวกเขาต้องทำและหนังสือไม่ได้สอนวิธีแก้ปัญหาที่เหมาะสมกว่านี้ ตอนนี้เมื่อคุณเข้าใจวิธีการแทนที่เซสชันให้ใช้ประโยชน์จากมัน! บางทีปัญหาประสิทธิภาพที่มีปัญหาอยู่เสมอสามารถปรับปรุงได้มาก!