لقد كتبت مقالتين من قبل، "تخصيص الجلسة (2) - حفظ قاعدة البيانات" و"لماذا لا أستخدم الجلسة"
ولكن في وقت لاحق اكتشف أن هناك مشاكل. المعالجة السابقة تكاد تكون عديمة الفائدة في الممارسة العملية، ويجب التعامل مع إعادة تدوير الجلسة بشكل منفصل. يقوم الأخير بتشغيل قاعدة البيانات بشكل متكرر، مما يسبب مشاكل كبيرة في الأداء.
وبعد دراسة متأنية في اليومين الماضيين، تم تقديم خطة تقريبية، ولكن لم يكن هناك اختبار محدد ومفصل.
1. الجمع بين معالجة الجلسة والإحصائيات. يتم تسجيل الزوار أيضا.
2. استخدم قاعدة البيانات وملفات تعريف الارتباط بشكل كامل لمحاكاة وظائف الجلسة.
3. يجب إكمال عمليات المستخدم في الجلسة في عبارة SQL واحدة قدر الإمكان. عندما لا تكون هناك حاجة للجلسة، لا يوجد مطلقًا أكثر من استعلام واحد.
4. من أجل الكفاءة، لم يتم دمج إعادة تدوير الجلسة، ولكن يتم توفير واجهة ويمكن استدعاؤها لتنفيذها.
يتم إعطاء الرمز مؤقتًا دون شرح تفصيلي.
SQL
إنشاء جدول `*****_جلسة` (
`sid` شار (32) ليس فارغًا،
`uid` int(10) ليس فارغًا،
`اسم المستخدم` شار (32) ليس فارغًا،
`نوع المستخدم` tinyint(1) ليس فارغًا،
`activetime` int(10) ليس فارغًا،
`انتهاء الصلاحية` int(10) ليست فارغة،
`ip` شار (15) ليس فارغًا،
`url` شار (80) ليس فارغًا،
`القيمة` شار (255) ليست فارغة،
المفتاح الأساسي (`sid`)
) المحرك=مجموعة الأحرف الافتراضية للذاكرة=utf8;
كود PHP
<؟
جلسة صفية {
خاص $_sessionPrex= '';// بادئة الجلسة
خاص $_time = '';//الوقت الحالي
Private $_model = null; // نموذج تشغيل قاعدة البيانات
خاص $_expiry = 1200;//مدة صلاحية الجلسة
خاص $_domain = '';// نطاق الجلسة
protected $isNew = 0;// تحديد إجراء العملية 0 التحديث 1 زيادة
protected $session = array();// سجل الجلسة المقابلة
الوظيفة العامة __construct($options){
$this->_setOptions($options);
if(فارغ($this->_time))$this->_time = time();
$this->session['activetime'] = $this->_time;
}
تبدأ الوظيفة العامة (){
$this->_getSid();
}
مجموعة الوظائف العامة(مفتاح $، قيمة $) {
if(in_array($key,array('uid','username','usertype','url','expiry'))){
إذا($مفتاح == 'انتهاء الصلاحية'){
$this->_setCookie($this->_sessionPrex.'_sid',$this->session['sid'],$value);
$this->_setCookie($this->_sessionPrex.'_uid',$this->session['uid'],$value);
}
$this->session[$key] = $value;
}آخر{
$other = $this->session['value'];
$other[$key] = $value;
$this->session['value'] = $other;
}
}
الحصول على الوظيفة العامة(مفتاح $){
if(in_array($key,array('uid','username','usertype','url','expiry'))){
إرجاع $this->session[$key];
}آخر{
إذا(isset($this->session['value'][$key])){
إرجاع $this->session['value'][$key];
}
عودة فارغة؛
}
}
الوظيفة العامة gc($file,$time = 1200){
$lasttime = file_get_contents($file);
إذا($lasttime + $time<$this->_time){
file_put_contents($file,$this->_time);
return $this->_model->delete('activetime+expiry<'.$this->_time);
}
}
تدمير الوظيفة العامة () {
$this->session['uid'] = 0;
$this->session['username'] = '';
$this->session['usertype'] = -1;
$this->session['expiry'] = $this->_expiry;
$this->session['value'] = array();
$this->_setCookie($this->_sessionPrex.'_sid',$this->session['sid'],$this->_expiry);
$this->_setCookie($this->_sessionPrex.'_uid',$this->session['uid'],$this->_expiry);
}
الوظيفة العامة __تدمير(){
$this->_save();
}
وظيفة خاصة _حفظ (){
$dbSession = $this->session;
$dbSession['value'] = serialize($dbSession['value']);
if(strlen($dbSession['value'])>255)$this->_error('session->القيمة طويلة جدًا!');
إذا($هذا->جديد == 1){
//يزيد
$this->_model->insert($dbSession);
}آخر{
//تجديد
$sid = $dbSession['sid'];
$this->_model->update(array_slice($dbSession,1),'sid=''.$sid.''');
}
}
وظيفة خاصة _getSession($sid){
$dbSession = $this->_model->detail('sid = ''.$sid.''');
إذا أرجع (!$dbSession) خطأً؛
$dbSession['value'] = unserialize($dbSession['value']);
$this->session = array_merge($dbSession,$this->session);
عودة صحيحة؛
}
وظيفة خاصة _getSid(){
$sid = strip_tags($_COOKIE[$this->_sessionPrex.'_sid']);
إذا (سترلين($sid)==32){
إذا($this->_getSession($sid)){
عودة صحيحة؛
}
}آخر{
$sid = md5(time().mt_rand(1000,10000));
$this->_setCookie($this->_sessionPrex.'_sid',$sid);
}
$this->_setCookie($this->_sessionPrex.'_uid',0);
$هذا->الجلسة = المصفوفة(
'معرف' => 0،
'اسم المستخدم' => '',
'نوع المستخدم' => -1،
'activetime' => $this->_time,
'ip' => $this->_getip(),
'url' => strip_tags($_SERVER['REQUEST_URI']),
'انتهاء الصلاحية' =>$this->_expiry،
'القيمة' => المصفوفة ()
);
$this->isNew = 1;
$this->session['sid'] = $sid;
}
وظيفة خاصة _setCookie($name,$value,$expiry=0){
if(empty($expiry))$expiry = $this->_expiry;
إذا(فارغ($this->_domain)){
setcookie($name,$value,$this->_time + $expiry,'/');
}آخر{
setcookie($name,$value,$this->_time + $expiry,'/',$this->_domain);
}
}
وظيفة خاصة _getip () {
إرجاع getip();
}
وظيفة خاصة _setOptions($options){
foreach ($خيارات كـ $key=>$value){
if(in_array($key,array('sessionPrex','time','model','expiry','domain'))){
$key = '_'.$key;
$this->$key = $value;
}
}
}
وظيفة خاصة _خطأ($msg){
طرح Phpbean_Exception($msg);
}
}
?>
(لاحظ أنه لا يمكن استخدام هذا الرمز بشكل مباشر، فهذه المقالة توفر فكرة بشكل أساسي)