আমার একটি সেশনটি 30 মিনিটের জন্য জীবিত রাখা এবং তারপরে এটি নষ্ট করা দরকার।
আমার একটি সেশনটি 30 মিনিটের জন্য জীবিত রাখা এবং তারপরে এটি নষ্ট করা দরকার।
উত্তর:
আপনার নিজের একটি সেশন সময়সীমা বাস্তবায়ন করা উচিত। অন্যদের দ্বারা উল্লিখিত উভয় বিকল্প ( সেশন. gc_max Life টাইম এবং অধিবেশন.কুকি_লাইফটাইম ) নির্ভরযোগ্য নয়। আমি এর কারণগুলি ব্যাখ্যা করব।
প্রথম:
অধিবেশন.সি_ম্যাক্সলাইফটাইম
সেশন.সি_ম্যাক্সালাইফটাইম সেকেন্ডের সংখ্যা নির্দিষ্ট করে যার পরে ডেটা 'আবর্জনা' হিসাবে দেখা হবে এবং পরিষ্কার হবে। অধিবেশন শুরুর সময় জঞ্জাল সংগ্রহ ঘটে।
তবে আবর্জনা সংগ্রহকারী কেবলমাত্র সেশন . gc_divisor দ্বারা বিভক্ত সেশন . gc_probability এর সম্ভাব্যতা দিয়ে শুরু করা হয়েছে । এবং এই বিকল্পগুলির জন্য ডিফল্ট মানগুলি (যথাক্রমে 1 এবং 100) ব্যবহার করে, সুযোগটি কেবল 1% এ।
ঠিক আছে, আপনি সহজেই এই মানগুলি সামঞ্জস্য করতে পারেন যাতে আবর্জনা সংগ্রহকারী আরও প্রায়শই শুরু হয়। তবে আবর্জনা সংগ্রহকারী শুরু করা হলে, এটি প্রতিটি নিবন্ধিত সেশনের জন্য বৈধতা পরীক্ষা করবে। এবং এটি ব্যয়বহুল।
তদ্ব্যতীত, পিএইচপি-র ডিফল্ট সেশন.সভে_হ্যান্ডলার ফাইলগুলি ব্যবহার করার সময়, সেশন ডেটা ফাইলগুলিতে সেশন- সেভ_প্যাথে নির্দিষ্ট একটি স্টোরে সংরক্ষণ করা হয় । সেই সেশন হ্যান্ডলারটির সাহায্যে সেশন ডেটার বয়সটি ফাইলের শেষ পরিবর্তনের তারিখে এবং শেষ অ্যাক্সেসের তারিখে নয় গণনা করা হয়:
দ্রষ্টব্য: আপনি যদি ডিফল্ট ফাইল-ভিত্তিক সেশন হ্যান্ডলারটি ব্যবহার করে থাকেন তবে আপনার ফাইল সিস্টেমে অবশ্যই অ্যাক্সেসের সময়গুলি (অ্যাটাইম) ট্র্যাক রাখতে হবে। উইন্ডোজ এফএটি তেমন নয় তাই আপনার সেশন সংগ্রহ করার আবর্জনা সামলানোর জন্য আপনাকে অন্য কোনও উপায় নিয়ে আসতে হবে যদি আপনি কোনও এফএটি ফাইল সিস্টেম বা অন্য কোনও ফাইল সিস্টেম যেখানে আটটাইম ট্র্যাকিং উপলব্ধ না থাকে তখন আটকে থাকেন। পিএইচপি ৪.২.৩ থেকে এটি এমটাইমের পরিবর্তে (পরিবর্তিত তারিখ) ব্যবহার করেছে। সুতরাং, টাইম ট্র্যাকিং উপলব্ধ নেই এমন ফাইল সিস্টেমগুলিতে আপনার সমস্যা হবে না।
সুতরাং এটিও ঘটতে পারে যে সেশন ডেটা ফাইল মুছে ফেলা হয়েছে যখন সেশনটি নিজেই এখনও বৈধ হিসাবে বিবেচিত হবে কারণ সেশন ডেটা সম্প্রতি আপডেট হয়নি updated
এবং দ্বিতীয়:
অধিবেশন কুকি_লাইফটাইম
সেশন.কুকি_লাইফটাইম ব্রাউজারে প্রেরণ করা সেকেন্ডের মধ্যে কুকির জীবনকাল নির্দিষ্ট করে specif [...]
হ্যা, তা ঠিক. এটি কেবল কুকি জীবনকালকেই প্রভাবিত করে এবং সেশনটি এখনও বৈধ হতে পারে। তবে ক্লায়েন্ট নয়, একটি সেশনটি অবৈধ করা সার্ভারের কাজ। সুতরাং এটি কিছুই সাহায্য করে না। আসলে, সেশনের কুকি_ লাইফটাইম সেট করার 0
ফলে সেশনটির কুকিকে আসল সেশনের কুকি তৈরি করা হবে যা ব্রাউজারটি বন্ধ না হওয়া পর্যন্ত কেবল বৈধ।
উপসংহার / সেরা সমাধান:
সেরা সমাধান হ'ল নিজের একটি সেশন সময়সীমা বাস্তবায়ন। একটি সাধারণ টাইম স্ট্যাম্প ব্যবহার করুন যা শেষ ক্রিয়াকলাপের সময়কে বোঝায় (যেমন অনুরোধ) এবং প্রতিটি অনুরোধের সাথে এটি আপডেট করুন:
if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
// last request was more than 30 minutes ago
session_unset(); // unset $_SESSION variable for the run-time
session_destroy(); // destroy session data in storage
}
$_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp
প্রতিটি অনুরোধের সাথে সেশন ডেটা আপডেট করার ফলে সেশন ফাইলের পরিবর্তনের তারিখও পরিবর্তিত হয় যাতে সময়টি আবর্জনা সংগ্রহকারী দ্বারা সেশনটি সরিয়ে না দেওয়া হয়।
অধিবেশন নির্ধারণের মতো সেশনের উপর আক্রমণ এড়াতে আপনি পর্যায়ক্রমে সেশন আইডি পুনরায় তৈরি করতে অতিরিক্ত টাইম স্ট্যাম্প ব্যবহার করতে পারেন :
if (!isset($_SESSION['CREATED'])) {
$_SESSION['CREATED'] = time();
} else if (time() - $_SESSION['CREATED'] > 1800) {
// session started more than 30 minutes ago
session_regenerate_id(true); // change session ID for the current session and invalidate old session ID
$_SESSION['CREATED'] = time(); // update creation time
}
মন্তব্য:
session.gc_maxlifetime
এই কাস্টম মেয়াদোত্তীর্ণ হ্যান্ডলারের জীবদ্দশায় কমপক্ষে সমান হওয়া উচিত (এই উদাহরণে 1800);setcookie
একটি এর মেয়াদ শেষ সঙ্গে time()+60*30
অধিবেশন কুকি সক্রিয় রাখা।$_SESSION['LAST_ACTIVITY']
অনুরূপ $_SESSION['CREATED']
যেখানে আপনি প্রতি অনুরোধ ব্যবহারকারীর সর্বশেষ কার্যকলাপের সময় কিন্তু আপডেটের যে মান সংরক্ষণ করি। এখনকার সময়ের সাথে বর্তমান সময়ের পার্থক্য যদি 1800 সেকেন্ডের বেশি হয় তবে 30 সেকেন্ডের বেশি সময় সেশনটি ব্যবহার করা হয়নি।
session_unset
একই কাজ করে $_SESSION = array()
।
ini_set('session.gc-maxlifetime', 1800)
? অন্যথায় আপনার সেশনটির তথ্যটি আপনার সেশনটি এখনও বৈধ বলে মনে করা হলেও এটি নষ্ট হয়ে যেতে পারে, যদি অন্তত ইনআই সেটিংটি 24 মিনিটের মান হয়। নাকি আমি কিছু মিস করছি?
files
। সুতরাং সেশন.gc_max Lifetime এই কাস্টম মেয়াদোত্তীর্ণ হ্যান্ডলারের জীবন সময়ের কমপক্ষে সমান হওয়া উচিত।
দ্রষ্টব্য: আপনি যদি সময়টি পরিবর্তন করতে চান তবে আপনার পছন্দসই সময় দিয়ে 30 টি পরিবর্তন করুন এবং * 60 পরিবর্তন করবেন না: এটি কয়েক মিনিট সময় দেবে।
মিনিটের মধ্যে: (30 * 60)
দিনগুলিতে: (n * 24 * 60 * 60) n = দিন নয়
<?php
session_start();
?>
<html>
<form name="form1" method="post">
<table>
<tr>
<td>Username</td>
<td><input type="text" name="text"></td>
</tr>
<tr>
<td>Password</td>
<td><input type="password" name="pwd"></td>
</tr>
<tr>
<td><input type="submit" value="SignIn" name="submit"></td>
</tr>
</table>
</form>
</html>
<?php
if (isset($_POST['submit'])) {
$v1 = "FirstUser";
$v2 = "MyPassword";
$v3 = $_POST['text'];
$v4 = $_POST['pwd'];
if ($v1 == $v3 && $v2 == $v4) {
$_SESSION['luser'] = $v1;
$_SESSION['start'] = time(); // Taking now logged in time.
// Ending a session in 30 minutes from the starting time.
$_SESSION['expire'] = $_SESSION['start'] + (30 * 60);
header('Location: http://localhost/somefolder/homepage.php');
} else {
echo "Please enter the username or password again!";
}
}
?>
<?php
session_start();
if (!isset($_SESSION['luser'])) {
echo "Please Login again";
echo "<a href='http://localhost/somefolder/login.php'>Click Here to Login</a>";
}
else {
$now = time(); // Checking the time now when home page starts.
if ($now > $_SESSION['expire']) {
session_destroy();
echo "Your session has expired! <a href='http://localhost/somefolder/login.php'>Login here</a>";
}
else { //Starting this else one [else1]
?>
<!-- From here all HTML coding can be done -->
<html>
Welcome
<?php
echo $_SESSION['luser'];
echo "<a href='http://localhost/somefolder/logout.php'>Log out</a>";
?>
</html>
<?php
}
}
?>
<?php
session_start();
session_destroy();
header('Location: http://localhost/somefolder/login.php');
?>
Login.php
শিরোনামগুলি সামগ্রীর পরে প্রেরণ করা হয়, যা খারাপ।
এটি কি কোনও নির্দিষ্ট সময়ের পরে ব্যবহারকারীর লগ আউট করা যায়? এটি নিবন্ধিত হওয়ার পরে সেশন তৈরির সময় (বা একটি সমাপ্তির সময়) সেট করা এবং তারপরে প্রতিটি পৃষ্ঠায় লোড পরীক্ষা করে তা পরিচালনা করতে পারে।
উদাহরণ:
$_SESSION['example'] = array('foo' => 'bar', 'registered' => time());
// later
if ((time() - $_SESSION['example']['registered']) > (60 * 30)) {
unset($_SESSION['example']);
}
সম্পাদনা করুন: আপনার কাছে অন্যরকম কিছু বোঝার মতো অনুভূতি পেয়েছি।
আপনি session.gc_maxlifetime
ইনআই সেটিংটি ব্যবহার করে একটি নির্দিষ্ট জীবনকাল পরে সেশনগুলি স্ক্র্যাপ করতে পারেন :
সম্পাদনা: ini_set ('অধিবেশন.gc_max Lifetime', 60 * 30);
gc_maxlifetime
নাকি gc-maxlifetime
। এটি কি আন্ডারস্কোর এবং হাইফেন উভয়কেই সমর্থন করে?
এই পোস্টটি অধিবেশন সময়সীমা নিয়ন্ত্রণের বেশ কয়েকটি উপায় দেখায়: http://bytes.com/topic/php/insights/889606-setting-timeout-php-sessions
আইএমএইচও দ্বিতীয় বিকল্পটি একটি দুর্দান্ত সমাধান:
<?php
/***
* Starts a session with a specific timeout and a specific GC probability.
* @param int $timeout The number of seconds until it should time out.
* @param int $probability The probablity, in int percentage, that the garbage
* collection routine will be triggered right now.
* @param strint $cookie_domain The domain path for the cookie.
*/
function session_start_timeout($timeout=5, $probability=100, $cookie_domain='/') {
// Set the max lifetime
ini_set("session.gc_maxlifetime", $timeout);
// Set the session cookie to timout
ini_set("session.cookie_lifetime", $timeout);
// Change the save path. Sessions stored in teh same path
// all share the same lifetime; the lowest lifetime will be
// used for all. Therefore, for this to work, the session
// must be stored in a directory where only sessions sharing
// it's lifetime are. Best to just dynamically create on.
$seperator = strstr(strtoupper(substr(PHP_OS, 0, 3)), "WIN") ? "\\" : "/";
$path = ini_get("session.save_path") . $seperator . "session_" . $timeout . "sec";
if(!file_exists($path)) {
if(!mkdir($path, 600)) {
trigger_error("Failed to create session save path directory '$path'. Check permissions.", E_USER_ERROR);
}
}
ini_set("session.save_path", $path);
// Set the chance to trigger the garbage collection.
ini_set("session.gc_probability", $probability);
ini_set("session.gc_divisor", 100); // Should always be 100
// Start the session!
session_start();
// Renew the time left until this session times out.
// If you skip this, the session will time out based
// on the time when it was created, rather than when
// it was last used.
if(isset($_COOKIE[session_name()])) {
setcookie(session_name(), $_COOKIE[session_name()], time() + $timeout, $cookie_domain);
}
}
ঠিক আছে আমি বুঝতে পারছি উপরের উত্তরগুলি সঠিক তবে সেগুলি অ্যাপ্লিকেশন পর্যায়ে রয়েছে, কেন আমরা .htaccess
মেয়াদোত্তীর্ণ সময় সেট করতে কেবল ফাইলটি ব্যবহার করি না ?
<IfModule mod_php5.c>
#Session timeout
php_value session.cookie_lifetime 1800
php_value session.gc_maxlifetime 1800
</IfModule>
এটি session_set_cookie_params
তৈরি করার জন্য ফানসিটন ব্যবহার করুন।
এই ফাংশন কল করার আগে প্রয়োজনীয় session_start()
কল কল করা প্রয়োজনীয়।
এটা চেষ্টা কর:
$lifetime = strtotime('+30 minutes', 0);
session_set_cookie_params($lifetime);
session_start();
আরও দেখুন: http://php.net/manual/function.session-set-cookie-params.php
এটি নীচের মত একটি ফাংশন দিয়ে আসলে সহজ। এটি ডাটাবেস টেবিলের নাম 'সেশন' ক্ষেত্রগুলির সাথে 'আইডি' এবং 'সময়' ব্যবহার করে।
প্রতিবার ব্যবহারকারী যখন আপনার সাইট বা পরিষেবাতে আবার যান তখন আপনাকে এই ফাংশনটি জিজ্ঞাসা করতে হবে এটির ফেরতের মান সত্য কিনা তা পরীক্ষা করার জন্য। যদি এটি মিথ্যা হয় তবে ব্যবহারকারীর মেয়াদ শেষ হয়ে গেছে এবং সেশনটি নষ্ট হয়ে যাবে (দ্রষ্টব্য: এই ফাংশনটি ডাটাবেস সংযোগ করতে এবং জিজ্ঞাসা করার জন্য একটি ডাটাবেস ক্লাস ব্যবহার করে, অবশ্যই আপনি এটি আপনার ফাংশন বা এর মতো কিছু করতে পারেন):
function session_timeout_ok() {
global $db;
$timeout = SESSION_TIMEOUT; //const, e.g. 6 * 60 for 6 minutes
$ok = false;
$session_id = session_id();
$sql = "SELECT time FROM sessions WHERE session_id = '".$session_id."'";
$rows = $db->query($sql);
if ($rows === false) {
//Timestamp could not be read
$ok = FALSE;
}
else {
//Timestamp was read succesfully
if (count($rows) > 0) {
$zeile = $rows[0];
$time_past = $zeile['time'];
if ( $timeout + $time_past < time() ) {
//Time has expired
session_destroy();
$sql = "DELETE FROM sessions WHERE session_id = '" . $session_id . "'";
$affected = $db -> query($sql);
$ok = FALSE;
}
else {
//Time is okay
$ok = TRUE;
$sql = "UPDATE sessions SET time='" . time() . "' WHERE session_id = '" . $session_id . "'";
$erg = $db -> query($sql);
if ($erg == false) {
//DB error
}
}
}
else {
//Session is new, write it to database table sessions
$sql = "INSERT INTO sessions(session_id,time) VALUES ('".$session_id."','".time()."')";
$res = $db->query($sql);
if ($res === FALSE) {
//Database error
$ok = false;
}
$ok = true;
}
return $ok;
}
return $ok;
}
সেশনে একটি টাইমস্ট্যাম্প সঞ্চয় করুন
<?php
$user = $_POST['user_name'];
$pass = $_POST['user_pass'];
require ('db_connection.php');
// Hey, always escape input if necessary!
$result = mysql_query(sprintf("SELECT * FROM accounts WHERE user_Name='%s' AND user_Pass='%s'", mysql_real_escape_string($user), mysql_real_escape_string($pass));
if( mysql_num_rows( $result ) > 0)
{
$array = mysql_fetch_assoc($result);
session_start();
$_SESSION['user_id'] = $user;
$_SESSION['login_time'] = time();
header("Location:loggedin.php");
}
else
{
header("Location:login.php");
}
?>
এখন, টাইমস্ট্যাম্প অনুমোদিত সময় উইন্ডোর মধ্যে রয়েছে কিনা তা পরীক্ষা করুন (1800 সেকেন্ড 30 মিনিট)
<?php
session_start();
if( !isset( $_SESSION['user_id'] ) || time() - $_SESSION['login_time'] > 1800)
{
header("Location:login.php");
}
else
{
// uncomment the next line to refresh the session, so it will expire after thirteen minutes of inactivity, and not thirteen minutes after login
//$_SESSION['login_time'] = time();
echo ( "this session is ". $_SESSION['user_id'] );
//show rest of the page and all other content
}
?>
দয়া করে আপনার অন্তর্ভুক্ত ফাইলটিতে কোডের নিম্নলিখিত ব্লকটি ব্যবহার করুন যা প্রতিটি পৃষ্ঠায় লোড হয়।
$expiry = 1800 ;//session expiry required after 30 mins
if (isset($_SESSION['LAST']) && (time() - $_SESSION['LAST'] > $expiry)) {
session_unset();
session_destroy();
}
$_SESSION['LAST'] = time();
এই ক্লাসটি 30 মিনিটের জন্য ব্যবহার করুন
class Session{
public static function init(){
ini_set('session.gc_maxlifetime', 1800) ;
session_start();
}
public static function set($key, $val){
$_SESSION[$key] =$val;
}
public static function get($key){
if(isset($_SESSION[$key])){
return $_SESSION[$key];
} else{
return false;
}
}
public static function checkSession(){
self::init();
if(self::get("adminlogin")==false){
self::destroy();
header("Location:login.php");
}
}
public static function checkLogin(){
self::init();
if(self::get("adminlogin")==true){
header("Location:index.php");
}
}
public static function destroy(){
session_destroy();
header("Location:login.php");
}
}
টাইমস্ট্যাম্প ব্যবহার করে ...
<?php
if (!isset($_SESSION)) {
$session = session_start();
}
if ($session && !isset($_SESSION['login_time'])) {
if ($session == 1) {
$_SESSION['login_time']=time();
echo "Login :".$_SESSION['login_time'];
echo "<br>";
$_SESSION['idle_time']=$_SESSION['login_time']+20;
echo "Session Idle :".$_SESSION['idle_time'];
echo "<br>";
} else{
$_SESSION['login_time']="";
}
} else {
if (time()>$_SESSION['idle_time']){
echo "Session Idle :".$_SESSION['idle_time'];
echo "<br>";
echo "Current :".time();
echo "<br>";
echo "Session Time Out";
session_destroy();
session_unset();
} else {
echo "Logged In<br>";
}
}
?>
টাইমস্ট্যাম্প ব্যবহার করে সেশনটির মেয়াদ শেষ করতে আমি 20 সেকেন্ড ব্যবহার করেছি ।
আপনার যদি 30 মিনিটের প্রয়োজন হয় 1800 (সেকেন্ডে 30 মিনিট) যোগ করুন ...
বিকল্প হিসাবে এটি করতে আপনি সরাসরি ডিবি ব্যবহার করতে পারেন। আমি chk_lgn বলি এটি করতে আমি একটি ডিবি ফাংশন ব্যবহার করি।
তারা লগ ইন করেছে কিনা তা লগইন চেকগুলি পরীক্ষা করে দেখুন এবং এটি করে এটি ব্যবহারকারীর ডিবি সারি / কলামে সর্বশেষ সক্রিয় হিসাবে চেকটির তারিখের সময়টিকিট নির্ধারণ করে।
আমি সেখানে সময় চেক করি। আমি প্রতিটি পৃষ্ঠার জন্য এই ফাংশনটি ব্যবহার করি কারণ মুহূর্তের জন্য এটি আমার জন্য কাজ করে।
PS আমি দেখেছি এমন কেউই খাঁটি ডিবি সমাধানের পরামর্শ দেয়নি।
পিএইচপি কীভাবে সেশনগুলি পরিচালনা করে তা শুরুর জন্য বিগুরুত্বপূর্ণ is এটি কীভাবে সেশনগুলি কাজ করে তার একটি ওভারভিউ দিয়ে তাদের সহায়তা করতে পারে: সেশনগুলি কীভাবে কাজ করে (কাস্টম-সেশন-হ্যান্ডলারগুলি)
কেবলমাত্র বর্তমান সময়টি সংরক্ষণ করুন এবং যদি এটি তুলনা করে 30 মিনিটের বেশি হয় তবে বর্তমান সেশনটি ধ্বংস করুন।