PDA

View Full Version : با ذخیره سشن در دیتابیس با بستن مرورگر سشن نابود نمیشه!



saeed-71
پنج شنبه 01 خرداد 1393, 13:23 عصر
سلام.
با ذخیره سشن در دیتابیس با بستن مرورگر سشن نابود نمیشه!
من با pdo ذخیره میکنم.چیکار کنم مرورگر که بسته میشه سشن نابود بشه و اطلاعات سشن از دیتابیس پاک بشن؟

Mori Bone
پنج شنبه 01 خرداد 1393, 13:36 عصر
آموزش: ذخیره Session ها در db با pdo (http://barnamenevis.org/showthread.php?444135-%D8%B0%D8%AE%DB%8C%D8%B1%D9%87-Session-%D9%87%D8%A7-%D8%AF%D8%B1-db-%D8%A8%D8%A7-pdo)

saeed-71
پنج شنبه 01 خرداد 1393, 14:07 عصر
آموزش: ذخیره Session ها در db با pdo (http://barnamenevis.org/showthread.php?444135-%D8%B0%D8%AE%DB%8C%D8%B1%D9%87-Session-%D9%87%D8%A7-%D8%AF%D8%B1-db-%D8%A8%D8%A7-pdo)
منم از همین روش اسفاده کردم.ام با بستن مرورگر سشن نابود نمیشه.

masiha68
پنج شنبه 01 خرداد 1393, 14:13 عصر
امکان ندار ... با بستن مرورگر سشن حتما نابود میشه مگر در شرایط خاصی ... بهتره توی بازه ی رمانی مثلا 5 دقیقه چک کنی ببینی سشن وجود داره یا نه
یا تایمی که واسه از بین رفتن سشن میزاری در صورت ابدیت نشدن سشن رو از دیتابیس حذف کن

saeed-71
پنج شنبه 01 خرداد 1393, 14:23 عصر
چجوری این کار رو کنم؟

masiha68
پنج شنبه 01 خرداد 1393, 14:27 عصر
خب شما فرض می کنیم که یه سشن به مدت 15 دقیقه توی دیتابیس ذخیره می کنید . حالا هر بار که کاربر یه صفحه رو باز کرد زمان سشن اپدیت میشه و در صورتی که به مدت 15 دقیقه با سیستم کار نکرد سشن از بین میره .... این تئوری کاره و اگه کد میخوای کدت رو بزار تا واست کامل کنم

saeed-71
پنج شنبه 01 خرداد 1393, 15:05 عصر
این کد ذخیره سشن هستش.اون قسمت اخر که گفته شده اگه کاربر 24 دقیقه کاری نکرد سشن نابود میشه کار نمیکنه.همچینین من میخوام با بستن مرورگر هم سشن نابود بشه


<?php
abstract class PDOSession
{
private static $connect;
private static $oldData;

/**
* روش اتصال : Pdo .
*/
public static function init(PDO $connect)
{
self::$connect = $connect;
// اضافه کردن سیشن با تنظیمات مربوطه
session_set_save_handler('PDOSession::open', 'PDOSession::close',
'PDOSession::read', 'PDOSession::write',
'PDOSession::destroy', 'PDOSession::garbageCollect');
session_start();
}

/**
* باز کردن و پاچ کردن سیشن
*/
public static function open($save_path, $session_name)
{
// بر گردوندن سیشن
return true;
}

/**
* بستن سیشن
*/
public static function close()
{
return true;
}

/**
* ساخت آی دی سیشن و بار کردن آن
*/
public static function read($session_id)
{
// لود دیتابیس به روش پارام
$query = self::$connect->prepare('
SELECT data
FROM sessions
WHERE session_id = :session_id');
$query->execute(array(':session_id' => $session_id));

return $query->fetchColumn();
}

/**
* ذخیره کردن سیشن
*/
public static function write($session_id, $data)
{
// فراخانی دیتابیس و اپدیت سیشن ذخیره شده در دیتابیس

$query = self::$connect->prepare('
UPDATE sessions
SET data = :data, last_activity = :last_activity
WHERE session_id = :session_id');
$query->execute(array(
':session_id' => $session_id,
':data' => $data,
'last_activity' => time()));

// اگه آپدیت نشد بهش می گیم مجدد یکی بساز
if ($query->rowCount() == 0)
{
self::$connect
->prepare('
INSERT INTO sessions
(session_id, data, last_activity)
VALUES
(:session_id, :data, :last_activity)')
->execute(array(
':session_id' => $session_id,
':data' => $data,
'last_activity' => time())
);
}
}

/**
* حذف سیشن
*/
public static function destroy($session_id)
{
self::$connect
->prepare('
DELETE FROM sessions
WHERE session_id = :session_id')
->execute(array(':session_id' => $session_id));
}

/**
* تنظیمات مربوط به مدت زمان سیشن .
* اپر کاربر 24 دقیقه هیچ کاری با سیشن نکرد سیشن پاک میشه از رو جدول .
*/
public static function garbageCollect($lifetime)
{
self::$connect
->prepare('
DELETE FROM sessions
WHERE last_activity < :min_time')
->execute(array(':min_time' => time() - $lifetime));
}
}
?>

masiha68
پنج شنبه 01 خرداد 1393, 16:23 عصر
class SessionDb extends base{
private $timeExpair=7200; #time for destroy session (s) function __construct($name) { $this->init(); } static function init(){ session_start();} ##create session on Db function CreateSession($name) { $this->do_insert('session',array('namesession'=>$name,'timeexpire'=>$this->timeExpair + time())); } #ckek for session function ChekSession($name) { $this->do_show('session',array('sessionname'=>$name)); if($this->totalrow >0) { return true; } else { $this->destroy($name); header("location:UR location") ; exit; return false; }
} function UpdateSessionTime($name) { $this->do_update('session',array('timeexpire'=>time()+$this->timeExpair),array('sessionname'=>$name)); } function ChekExpair($name) { $do=$this->do_show('session',array('sessionname'=>$name)); foreach($do as $chek) { if(time()>$chek['timeexpair']) { $this->destroy($chek['sessionname']); } } } function destroy($name) { $this->do_del('session',array('sessionname'=>$name)); }}
خب این کلاس رو من نوشتم البته به نسبت کلاس دوستان ساده تر هست و کارش راحت تره
تست نکردم ببینم کار می کنه یا نه فقط به عنوان یه نمونه کد از روش کلاس خودتون رو بنویسید . من از کلاس دیتابیس ( بیس) ارث بری کردم که شما می تونید کدهای mysql یا pdo خودتون رو بزارید
موفق باشید

saeed-71
پنج شنبه 01 خرداد 1393, 16:47 عصر
ممنون.تو همون کلاس نمیشه تغییراتی داد؟

saeed-71
پنج شنبه 01 خرداد 1393, 17:02 عصر
اینم پیدا کردم.خوبه؟


<?php
//session_save_path("../tmp");
session_start();

//Settings
$diff=10*60; //600 Sec time out
$salt="this-is-uniq-hash-for-any-program";

$_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'] : 'NO USER AGENT';

$browser_data=$salt.$_ip.$_agent;
$browser_hash=md5($browser_data);

$now=time();

if (isset($_SESSION['last_time']) && isset($_SESSION['browser_hash'])){
if (strcasecmp($browser_hash,$_SESSION['browser_hash'])!=0
|| $now-$_SESSION['last_time']>$diff){
foreach ($_SESSION as $key => $value){
unset($_SESSION[$key]);
}
session_destroy();
//You can pass to login page or whatever :-"
header("Location: ".$_SERVER['PHP_SELF']);
die(); //THIS IS IMPORTANT, never trust user browser,
}
}else{
//this is new session....

//Old session but without time and browser hash ?
//Just destroy it, if any, to prevent hijaking
foreach ($_SESSION as $key => $value){
unset($_SESSION[$key]);
}

$_SESSION['last_time']=$now;
$_SESSION['browser_hash']=$browser_hash;
}

masiha68
پنج شنبه 01 خرداد 1393, 17:06 عصر
در کل کار کردن با کلاس های یکی دیگه واقعا حوصله می خواد ... سعی کن از رو همین خودت یکی بنوس
راحت تر می تونی گسترشش بدی و خطا یابی کنی
چیزی زیاد شاخی هم نیست که نشه نوشت

MMSHFE
پنج شنبه 01 خرداد 1393, 18:06 عصر
این که سشن بطور خودکار از بین نمیره ربطی به کلاس و... نداره. توی مدیریت سشن خود PHP هم همینطوره و مسئله اینه که مرورگرها موقعی که بسته میشن سرور رو باخبر نمیکنن و درنتیجه سرور تا زمان انقضای سشن، اون رو نگه میداره. بهترین کار اینه که خودتون توی متد خاصی مثل Open یا سازنده کلاس، رکوردهایی رو از دیتابیس که منقضی شدن، پیدا و حذف کنید.

saeed-71
جمعه 02 خرداد 1393, 14:18 عصر
این که سشن بطور خودکار از بین نمیره ربطی به کلاس و... نداره. توی مدیریت سشن خود PHP هم همینطوره و مسئله اینه که مرورگرها موقعی که بسته میشن سرور رو باخبر نمیکنن و درنتیجه سرور تا زمان انقضای سشن، اون رو نگه میداره. بهترین کار اینه که خودتون توی متد خاصی مثل Open یا سازنده کلاس، رکوردهایی رو از دیتابیس که منقضی شدن، پیدا و حذف کنید.
اون کلاس ذخیره سشن با pdo مشکلی نداره؟