เมื่อพิจารณาถึงประเด็นเรื่องเซสชัน ในที่สุดฉันก็ล้มเลิกเซสชัน:
1. เซสชันดั้งเดิมได้รับการจัดการโดยใช้ไฟล์ คุณภาพของระบบไฟล์ส่งผลโดยตรงต่อประสิทธิภาพของเซสชัน โดยเฉพาะอย่างยิ่งเมื่อมีผู้คน K หลายคนออนไลน์พร้อมกัน มีสองวิธี: ฐานข้อมูลและไฟล์ (โดยใช้เส้นทางแฮช)
2. เซสชันเดิมมีความสามารถในการปรับขนาดและการควบคุมได้ไม่ดี ไม่เอื้อต่อการบูรณาการกับระบบที่มีอยู่ของฉัน
3. เมื่อเลือกฐานข้อมูล ฉันไม่ได้เลือก sqlite ครั้งสุดท้ายที่ฉันทดสอบประสิทธิภาพของ sqlite บน win xp มันไม่ดีอย่างที่คาดไว้
สุดท้าย ฉันเลือกตารางฮีปของ myql เพื่อประมวลผลเซสชัน และรวมการประมวลผลเซสชันเข้ากับสถิติผู้ใช้ออนไลน์
รหัสที่ให้ไว้ด้านล่างนี้เป็นตัวอย่างของฉัน (ไม่มีรายละเอียดอื่นใดให้ไว้ การใช้งานเฉพาะจะต้องได้รับการแก้ไขตามนั้น)
-
-
* จัดการผู้ใช้ออนไลน์และจำลองเซสชัน
* สร้างตาราง `webqq_session` (
`sid` char( 32 ) NOT NULL ,
`uid` สื่อกลาง (8) ไม่เป็นโมฆะ
`ชื่อผู้ใช้` ถ่าน (80) ไม่เป็นโมฆะ
`ismember` Tinyint( 1 ) ไม่เป็นโมฆะ
`เวลาเข้าสู่ระบบ` int( 10 ) ไม่เป็นโมฆะ
`activetime` int( 10 ) ไม่เป็นโมฆะ
คีย์หลัก (`sid`)
) เครื่องยนต์ = HEAP DEFAULT CHARSET = gb2312
* @author:feifengxlq< http://www.phpobject.net > feifengxlq#gmail.com
* @ตั้งแต่:23-10-2549
* @copyright:http://www.phpobject.net
* หมายเหตุ: การใช้ไฟล์นี้จะต้องรวมกับไฟล์อื่นๆ เช่น การกรองคุกกี้ ฟังก์ชั่นพื้นฐานบางอย่าง และคลาสการดำเนินการฐานข้อมูล
-
เซสชั่นชั้นเรียน
-
var $mysql;
var $cookie_id='webqq_sid';
var $session=array();
var $max_time=1200;//เวลาสูงสุดเริ่มต้นคือ 20 นาที
ฟังก์ชั่น__สร้าง()
-
$this->mysql=new module(TB_PREX.'_session');//ต้องการการสนับสนุนจากภายนอก
$นี่->เริ่มต้น();
-
ฟังก์ชั่นเริ่มต้น()
-
ถ้า(ว่าง($_COOKIE[$this->cookie_id]))
-
// เริ่มต้นเซสชัน
$นี่->สร้าง();
}อื่น{
//มีคุกกี้อยู่แล้ว ตรวจสอบว่ามีอยู่ในฐานข้อมูลหรือไม่
$sid=$_COOKIE[$this->cookie_id];
if($this->mysql->detail('where sid=''.$sid.'''))
-
//มีอยู่ในฐานข้อมูล
$row['activetime']=time();
$this->mysql->update($row,'where sid=''.$sid.''');
$this->session=$this->mysql->detail('where sid=''.$sid.''');
}อื่น{
//ไม่มีอยู่ในฐานข้อมูล
$นี่->สร้าง();
-
-
//ลบผู้ใช้ที่ไม่ได้ออนไลน์อยู่ในฐานข้อมูล
$this->mysql->delete('where activetime+'.$this->max_time.'<'.time());
-
ฟังก์ชั่น register($name,$value,$update=false)
-
if(array_key_exists($name,$this->session)){
$นี่->เซสชัน[$ชื่อ]=$value;
-
if($update)$this->update();
-
ฟังก์ชั่นรีจิสตรี($name='')
-
if(empty($name)) ส่งคืน $this->session;
if(array_key_exists($name,$this->session)){
ส่งคืน $this->session[$name];
-
-
//อัพเดตข้อมูลเซสชั่นในฐานข้อมูล
อัพเดตฟังก์ชัน()
-
$row['uid']=$this->session['uid'];
$row['username']=$this->session['username'];
$row['ismember']=$this->session['ismember'];
$row['logintime']=$this->session['logintime'];
$row['activetime']=$this->session['activetime'];
$this->mysql->update($row,'where sid=''.$this->session['sid'].''');
-
/*-----------------ต่อไปนี้เป็นวิธีการส่วนตัว------------------------- --------------------------------***/
ฟังก์ชั่นสร้าง()
-
$ขณะนี้=เวลา();
$sid=md5('0'.$nowtime.getip());//จำเป็นต้องกำหนดฟังก์ชัน getip() ไว้ล่วงหน้า: รับที่อยู่ IP ของลูกค้า
setcookie($this->cookie_id,$sid,$nowtime+3600*24);//ค่าเริ่มต้น 24 ชั่วโมง
$row['sid']=$sid;
$แถว['uid']=0;
$row['username']='guest';
$row['ismember']=0;
$row['logintime']=$ขณะนี้;
$row['activetime']=$ขณะนี้;
$this->mysql->add($row);//เขียนลงฐานข้อมูล
$นี่->เซสชัน=$แถว;
-
-
-