PDA

View Full Version : حرفه ای: کلاس کامل ذخیره سازی session ها در دیتابیس



id1385
شنبه 09 فروردین 1393, 13:43 عصر
با سلام

برای اینکار ابتدا جدول زیر را در دیتابیس خود ایجاد نمایید توجه نمایید نام جدول را بنا بر دلخواه خود می توانید تغییر دهید.

ساخت جدول :

CREATE TABLE IF NOT EXISTS `ad_sessions` (
`RndKey` varchar(100) DEFAULT NULL,
`Data` longtext CHARACTER SET utf8,
`WriteOn` int(25) DEFAULT '0',
`TimeLife` int(25) DEFAULT '0',
`LastActivity` longtext CHARACTER SET utf8,
`KeepMe` tinyint(1) NOT NULL DEFAULT '0',
KEY `RndKey` (`RndKey`),
KEY `KeepMe` (`KeepMe`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;



یک فایل برای کدهای php خود اختصاص دهید و کدهای زیر را در آن قرار دهید.
کلاس:
چون به هم ریخته شد پیوست گردید

فایل بالا (انضمامی) دارای تعدادی فانکشن و یک کلاس و تعدادی متد هست.
توجه : اگر ساخت جدول نام جدول را به دلخواه تغییر داده اید در این فایل (کد php بالا) نیز نام قبلی را با نام فعلی (نام دلخواه انتخابی) جابجا نمایید.

فانکشنهای موجود کاملاً مشخص هستند ولی در مورد متدهای کلاس کمی توضیح لازم است:


توضیحات کلاس
--------------------------------------------------------------------
متد ses_start :
این فانکشن در اصل همان کاری را انجام میدهد که session_start() انجام میدهد منتها یک تابع می گیرد و آن مدت زمان بقاء یک جلسه می باشد که بصورت پیش فرض روی 24 دقیقه ست شده که می توانید پیش فرض آن را تغییر دهید و یا موقع استفاده از تابع آن را تنظیم نمایید.

متد ses_id :
این تابع سشن آیدی را بر میگرداند، وهر جا که شما نیاز به انجام فعالیت خاصی داشته باشید میتوانید از این مورد نیز استفاده نمایید.

متد ses_write :
پرکاربردترین متد این کلاس این مورد است به توابع این متد توجه نمایید

public function ses_write($ses_name = "", $ses_value = "", $timeLife_min = "")
- اولین تابع این متد ses_name می باشد که در اصل نام مورد نظر برای جلسه می باشد که باید آن را مقدار دهی نمایید در غیر اینصورت ساخته نمی شود.
- دومین تابع آن ses_value می باشد که مقدار مورد نظر برای جلسه می باشد که می تواند خالی نسز انخاب شود.
- سومین تابع timeLife_min می باشد که طول عمر یک جلسه منتها به دقیقه می باشد تا محاسبه آن راحتر باشد مثلاً موقع استفاده 10 وارد می شود.

متد ses_read :
این متد نیز پر کاربرد می باشد و از آن برای خواندن مقدار جلسه مورد نظر که نام آن توسط تابع ses_name در این متد ارسال میشود مورد استفاده قرار می گیرد.

متد ses_kill :
این متد همانطور که از آن نام آن پیداست برای نابود کردن یک جلسه بکار میرود و در آن طول عمر جلسه مد نظر قرار نخواهد گرفت.

متد ses_free_olds :
این متد نیز از نامش پیداست که جدول ما را از جلسات کهنه و قدیمی پاکسازی می کند.
توضیح: به نحوه کاربرد این متد در ادامه اشاره میشود، این متد جلساتی را که موقع بررسی برابر و یا کوچکتر از زمان بررسی باشد از بین خواهد برد، میتواند آن را فقط به جلسات کوچکتر از زمان بررسی تغییر دهید.

متد ses_empty :
این متد نیز پیداست که برای خالی کردن مقدار جلسه از بین میرود، متد پس از دریافت نام مورد نظر جلسه آن را خالی o,hin ;vn.


نحوه استفاده
--------------------------------------------------------------------

در فایل index و یا هر فایلی که میخواهید ابتدا فایل کلاس را include می کنیم.
همانطور که در فایل انضمامی نمونه آورده شده بعد از اینکلود کردن فایل کلاس ابتدا یک اینستنس از کلاس ایجاد می نماییم.


$tHesEssion = new the_session();


قبلاً در توضیح متدها اشاره شد بعد از انجام مورد بالا نوبت به پاکسازی دیتابیس از جلسات قدیمی و کهنه می نماییم


$tHesEssion->ses_free_olds();


بدست آوردن آیدی جلسه :


echo $tHesEssion->ses_id();


ایجاد یک جلسه :


$tHesEssion->ses_write("sample_name", "new value", 10);


خواندن مقدار جلسه :


$tHesEssion->ses_read("sample_name");


مقدار دهی جدید به جلسه:


$tHesEssion->ses_write("sample_name", "another value, session updated", 10);


همیشگی کردن یک جلسه (مرا بخاطر بسپار فرمها) :
مثلاً در یک فرمی چکباکسی وجود دارد که اگر کاربر آن را تیک بزند می خواهیم این جلسه را همیگشی نماییم و در هربار نیازی به بررسی لایف تایم نداشته باشیم


if ($rM === 'true') {
mysql_query("UPDATE `ad_sessions` SET `KeepMe` = 1;");
}


خالی کردن جلسه :


$tHesEssion->ses_empty("sample_name");


حذف جلسه :


$tHesEssion->ses_kill();



توجه داشته باشید این متدها بر حسب نیاز می تواند افزایش یابد و شما متدهای جدیدی به آن اضافه نمایید.
اگر مورد پسند بود با تشکر اعلام نمایید


موفق باشید.

MRmoon
شنبه 09 فروردین 1393, 15:04 عصر
اون چیزی شما ازش به نام تابع یاد کردید آرگومنت یا پارامتر هستش!

soroush.r70
شنبه 09 فروردین 1393, 16:55 عصر
از فواید ذخیره سازی سیشن در دیتابیس چیه میتونید بگید...؟

navid3d_69
یک شنبه 10 فروردین 1393, 12:36 عصر
از فواید ذخیره سازی سیشن در دیتابیس چیه میتونید بگید...؟

برای امنیت بیشتر در هاست هایی که سشن ها در پوشه tmp دخیره میشه ولی راه هایی دیگه هم هست که خودتون توی فایل و هر جایی دوست دارین ذخیره کنید و... که باید تحقیق کنید نسبت به پروژه ببنید کدام بهتر هست برای شما

MMSHFE
یک شنبه 10 فروردین 1393, 12:55 عصر
یکی دیگه از کاربردهاش، بحث نمایش کاربران آنلاین و امثال اینجور نیازهاست.

hassan20000
شنبه 01 فروردین 1394, 18:03 عصر
<?php

class session extends DB {


public $connection;
private $_time_out;
private $_salt;
private $_browser_hash;


public function __construct($time_out = 1200, $salt = '') {
parent::__construct();
date_default_timezone_set('Asia/Tehran');
if ($salt == '') {
$salt = md5('xcv#kj@KFG');
}


$this->_time_out = $time_out;
$this->_salt = $salt;
$this->calcHash();


session_set_save_handler(
array(&$this, 'Open'), array(&$this, 'Close'), array(&$this, 'Read'), array(&$this, 'Write'), array(&$this, 'Destroy'), array(&$this, 'GC')
);
ini_set('session.save_handler', 'user');
session_start();
}


//___________________________________________ Open __________________________________________________ __
//-------------------------------------------------------------------------------------------------------
public function Open($save_path, $session_name) {
return TRUE;
}


/**
* Deletes expired session
*/
private function _deleteExpired($maxlifetime) {
// $exxpire = time();
$date = time() - $maxlifetime;
$sql = $this->connection->prepare("DELETE FROM `tbl_session` WHERE (`modified` < $date)");
$sql->execute();
}


//___________________________________________ Close __________________________________________________ __
//-------------------------------------------------------------------------------------------------------
public function Close() {
$this->_deleteExpired($this->_time_out);
if (session_id() !== '') {
session_write_close();
}
return TRUE;
}


//___________________________________________ Write __________________________________________________ _
//-------------------------------------------------------------------------------------------------------
public function Write($id, $data) {
$hash = $this->_browser_hash;
$now = time();
// $sql = $this->connection->prepare("INSERT INTO `tbl_session` (`id`,`data`,`modified`,`hash`) VALUES (:id, :data, :now, :hash)
// ON DUPLICATE KEY UPDATE `data`=:data, `modified`=:now, `hash`=:hash");
$sql = $this->connection->prepare("REPLACE INTO `tbl_session` (`id`,`data`,`modified`,`hash`) VALUES (:id, :data, :now, :hash) ");


try {
$sql->execute(array(":id" => $id, ":data" => $data, ":now" => $now, ":hash" => $hash));
} catch (Exception $ex) {
return FALSE;
}
return TRUE;
}


//___________________________________________ Read __________________________________________________ __
//-------------------------------------------------------------------------------------------------------
public function Read($id) {
$sql = $this->connection->prepare("SELECT * FROM `tbl_session` WHERE (`id`=:id)");
try {
$sql->execute(array(":id" => $id));
} catch (Exception $ex) {
return '';
}


if ($sql->rowCount() != 1) {
return '';
}


$data = $sql->fetch(PDO::FETCH_ASSOC);
$time = $data['modified'];
$hash = $data['hash'];


if (time() - $this->_time_out || strcasecmp($this->_browser_hash, $hash) != 0) {
return '';
}


return $data['data'];
}


//___________________________________________ Distroy _________________________________________________
//-------------------------------------------------------------------------------------------------------
public function Destroy($id) {
$sql = $this->connection->prepare("DELETE FROM `tbl_session` WHERE (`id`=:id)");
try {
$sql->execute(array(":id" => $id));
} catch (Exception $ex) {
return FALSE;
}
$this->GC($this->_time_out);
return TRUE;
}


//___________________________________________ GC __________________________________________________ ____
//-------------------------------------------------------------------------------------------------------
public function GC($maxlifetime) {
$date = time() - $maxlifetime;
$sql = $this->connection->prepare("DELETE FROM `tbl_session` WHERE `modified`<:date");
try {
$sql->execute(array(':date' => $date));
} catch (Exception $ex) {
return FALSE;
}
return TRUE;
}


private function calcHash() {
$ip = isset($_SERVER['HTTP_CLIENT_IP']) ? $_SERVER['HTTP_CLIENT_IP'] : "Unknown";
$ip .= isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : "Unknown";
$ip .= isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : 'Unknown';
$agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : "Unknown";
$browser_data = $this->_salt . $ip . $agent;
$this->_browser_hash = md5($browser_data);
}


}