मुझे एक सत्र को 30 मिनट तक जीवित रखने और फिर इसे नष्ट करने की आवश्यकता है।
मुझे एक सत्र को 30 मिनट तक जीवित रखने और फिर इसे नष्ट करने की आवश्यकता है।
जवाबों:
आपको अपने स्वयं के एक सत्र के समय को लागू करना चाहिए। दूसरों द्वारा उल्लिखित दोनों विकल्प ( session.gc_maxlifetime और session.cookie_lifetime ) विश्वसनीय नहीं हैं। मैं उसके कारणों की व्याख्या करूँगा।
प्रथम:
session.gc_maxlifetime
session.gc_maxlifetime सेकंड की संख्या को निर्दिष्ट करता है जिसके बाद डेटा को 'कचरा' के रूप में देखा जाएगा और साफ किया जाएगा। सत्र प्रारंभ के दौरान कचरा संग्रहण होता है।
लेकिन कचरा संग्रहकर्ता केवल session.gc_probability से विभाजित होने की संभावना के साथ शुरू किया है । session.gc_divisor । और उन विकल्पों के लिए डिफ़ॉल्ट मान (क्रमशः 1 और 100) का उपयोग करके, मौका केवल 1% पर है।
ठीक है, आप बस इन मूल्यों को समायोजित कर सकते हैं ताकि कचरा कलेक्टर को अधिक बार शुरू किया जाए। लेकिन जब कचरा कलेक्टर शुरू किया जाता है, तो यह हर पंजीकृत सत्र के लिए वैधता की जांच करेगा। और यह लागत-गहन है।
इसके अलावा, जब पीएचपी के डिफ़ॉल्ट का उपयोग कर session.save_handler फ़ाइलें, सत्र डेटा फ़ाइलों में एक पथ में निर्दिष्ट में संग्रहित है session.save_path । उस सत्र हैंडलर के साथ, सत्र डेटा की आयु की गणना फ़ाइल की अंतिम संशोधन तिथि और अंतिम अभिगमन तिथि पर की जाती है:
नोट: यदि आप डिफ़ॉल्ट फ़ाइल-आधारित सत्र हैंडलर का उपयोग कर रहे हैं, तो आपके फ़ाइल सिस्टम को एक्सेस टाइम (atime) का ट्रैक रखना होगा। Windows FAT ऐसा नहीं करता है, तो आपको अपने सत्र को इकट्ठा करने के लिए एक और तरीका अपनाना होगा यदि आप FAT फाइल सिस्टम या किसी अन्य फाइल सिस्टम के साथ अटके हुए हैं, जहां atime ट्रैकिंग उपलब्ध नहीं है। PHP 4.2.3 के बाद से इसने atime के बजाय mtime (संशोधित तिथि) का उपयोग किया है। इसलिए, आपको उन फ़ाइल सिस्टम के साथ समस्याएँ नहीं होंगी जहाँ atime ट्रैकिंग उपलब्ध नहीं है।
इसलिए यह अतिरिक्त रूप से हो सकता है कि सत्र डेटा फ़ाइल हटा दी जाए, जबकि सत्र को अभी भी मान्य माना जाता है क्योंकि सत्र डेटा हाल ही में अपडेट नहीं किया गया था।
और दूसरा:
session.cookie_lifetime
session.cookie_lifetime सेकंड में कुकी का जीवनकाल निर्दिष्ट करता है जो ब्राउज़र को भेजा जाता है। [...]
हाँ य़ह सही हैं। यह केवल कुकी जीवनकाल को प्रभावित करता है और सत्र अभी भी मान्य हो सकता है। लेकिन यह क्लाइंट को नहीं बल्कि एक सत्र को अमान्य करने के लिए सर्वर का काम है। तो यह कुछ भी मदद नहीं करता है। वास्तव में, session.cookie_lifetime सेट होने 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_maxlifetime इस कस्टम समाप्ति हैंडलर के जीवन काल के कम से कम बराबर होना चाहिए।
नोट: यदि आप समय बदलना चाहते हैं, तो बस 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 सेटिंग का उपयोग करके एक निश्चित जीवनकाल के बाद सत्रों को स्क्रैप कर सकते हैं :
संपादित करें: ini_set ('session.gc_maxlifetime', 60 * 30);
gc_maxlifetime
या gc-maxlifetime
। क्या यह अंडरस्कोर और हाइफ़न दोनों का समर्थन करता है?
यह पोस्ट सत्र टाइमआउट को नियंत्रित करने के कुछ तरीके दिखाता है: http://bytes.com/topic/php/insights/889606-setting-timeout-php-session
IMHO दूसरा विकल्प एक अच्छा समाधान है:
<?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
यह वास्तव में निम्नलिखित की तरह एक समारोह के साथ आसान है। यह 'id' और 'time' फ़ील्ड के साथ डेटाबेस टेबल नाम 'सत्र' का उपयोग करता है।
हर बार जब उपयोगकर्ता आपकी साइट या सेवा पर दोबारा जाता है, तो आपको इस फ़ंक्शन को यह जांचने के लिए आमंत्रित करना चाहिए कि क्या इसका रिटर्न मान TRUE है या नहीं। यदि यह FALSE है, तो उपयोगकर्ता समाप्त हो गया है और सत्र नष्ट हो जाएगा (नोट: यह फ़ंक्शन डेटाबेस को जोड़ने और क्वेरी करने के लिए डेटाबेस वर्ग का उपयोग करता है, निश्चित रूप से आप इसे अपने फ़ंक्शन या ऐसा कुछ के अंदर भी कर सकते हैं):
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
}
?>
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 मिनट) ...
आप इसे विकल्प के रूप में करने के लिए किसी DB का उपयोग कर सकते हैं। मैं इसे करने के लिए DB फ़ंक्शन का उपयोग करता हूं जिसे मैं chk_lgn कहता हूं।
यह देखने के लिए कि वे लॉग इन हैं या नहीं, यह देखने के लिए लॉगिन चेक की जाँच करें, ऐसा करने के लिए, यह उपयोगकर्ता के डीबी पंक्ति / कॉलम में अंतिम सक्रिय के रूप में चेक की तारीख का समय निर्धारित करता है।
मैं वहां समय जांच भी करता हूं। यह मेरे लिए इस समय के लिए काम करता है क्योंकि मैं हर पृष्ठ के लिए इस फ़ंक्शन का उपयोग करता हूं।
पीएस कोई नहीं मैंने देखा था एक शुद्ध DB समाधान का सुझाव दिया था।
कैसे PHP हैंडल सत्र समझने के लिए शुरुआती के लिए काफी भ्रामक है। यह उनकी मदद कर सकता है कि सत्र कैसे काम करते हैं: कैसे सत्र कार्य (कस्टम-सत्र-हैंडलर)
बस वर्तमान समय को स्टोर करें और यदि तुलना करके यह 30 मिनट से अधिक है तो वर्तमान सत्र को नष्ट कर दें।