2010-06-18 25 views
44

मैं एक सत्र बनाने हूँ जब कोई उपयोगकर्ता इसलिए की तरह में लॉग:पीएचपी सत्र का समय समाप्त

$_SESSION['id'] = $id; 

मैं एक्स मिनट की है कि सत्र पर एक टाइमआउट निर्दिष्ट कर सकते हैं कैसे और फिर इसे प्रदर्शन एक समारोह या एक पृष्ठ एक बार पुन: निर्देशित किया है यह एक्स मिनट तक पहुंच गया है ??

संपादित करें: मैं यह उल्लेख करना भूल गया कि मुझे निष्क्रियता के कारण समय-समय पर सत्र की आवश्यकता है।

+9

संभावित डुप्लिकेट [मैं 30 मिनट के बाद PHP सत्र कैसे समाप्त करूं?] (Http://stackoverflow.com/questions/520237/how-do-i-expire-a-php- सत्र-after-30- मिनट) – Kzqai

उत्तर

86

पहले, पिछली बार जब उपयोगकर्ता अनुवर्ती अनुरोध में एक अनुरोध

<?php 
    $_SESSION['timeout'] = time(); 
?> 

बनाया स्टोर, जाँच कितनी देर पहले वे अपने पिछले अनुरोध (इस उदाहरण में 10 मिनट)

<?php 
    if ($_SESSION['timeout'] + 10 * 60 < time()) { 
    // session timed out 
    } else { 
    // session ok 
    } 
?> 
+20

लेकिन सत्र इससे पहले टाइमआउट कर सकता है, यदि आपके PHPINI में डिफ़ॉल्ट सत्र टाइमआउट आपके समय से छोटा है चुना है। टाइमआउट अक्सर डिफ़ॉल्ट रूप से एक घंटे से भी कम होता है। यदि आप क्लाइंट को टाइमआउट को नियंत्रित नहीं करना चाहते हैं, तो आपको session.cookie_lifetime के ini_set के साथ इस कोड को गठबंधन करने की आवश्यकता है। यह उत्तर उस मामले को भी संभाल नहीं करता है जहां ग्राहक अपनी कुकीज़ हटा देता है। – Olhovsky

+2

PHP डिफ़ॉल्ट '0' है जिसका अर्थ है: "जब तक ब्राउज़र बंद न हो जाए"। यदि ब्राउज़र कुकी को हटा देता है, तो '$ _SESSION ['timeout']' var पहले स्थान पर सेट नहीं किया जाएगा। हालांकि, मैंने अन्य सभी चीजें सत्र प्रबंधन को छोड़ दिया क्योंकि यह प्रश्न केवल टाइमआउट के बारे में पूछता है। – Jacco

42

सत्र डेटा समाप्त हो रहा है जब नहीं रह गया है मौजूद है, तो

की तरह कुछ
if (!isset($_SESSION['id'])) { 
    header("Location: destination.php"); 
    exit; 
} 

रीडायरेक्ट करेगा जब भी सत्र अब सक्रिय नहीं है।

आप का उपयोग session.cookie_lifetime

ini_set("session.cookie_lifetime","3600"); //an hour 

संपादित सेट कर सकते हैं कितनी देर तक सत्र कुकी जीवित है: यदि आप सुरक्षा चिंता का विषय (सुविधा के बजाय,), स्वीकार किए जाते हैं जवाब का उपयोग नीचे टिप्पणी के रूप में होने के कारण सत्र समय बाहर रहे हैं, तो दिखाएं, यह ग्राहक द्वारा नियंत्रित है और इस प्रकार सुरक्षित नहीं है। मैंने इसे सुरक्षा उपाय के रूप में कभी नहीं सोचा।

+1

आपको $ _SESSION ['id'] –

+0

के उद्धरणों को हटाना होगा, भले ही आपका वोट नहीं दिया गया हो, आपका समाधान अधिक सुरक्षित लगता है, मेरा प्रश्न यह है कि, क्या आपको प्रत्येक पृष्ठ पर उस सत्र टाइमआउट को सेट करना होगा? मुझे लगता है कि यह समझ में आएगा क्योंकि आप इसे हर बार पुनरारंभ करना चाहते हैं? दूसरा, क्या आपको सत्र डेटा पर प्रत्येक पृष्ठ के लिए सत्र_स्टार्ट करना होगा, या इसे बंद करने के लिए बस एक बार करना होगा? धन्यवाद – nagates

+10

सत्र कुकी जीवनकाल के साथ कुछ समस्याएं हैं, सबसे विशेष रूप से, यह इसे लागू करने के लिए * क्लाइंट * पर निर्भर करती है। कुकी लाइफटाइम क्लाइंट को बेकार/समाप्त होने वाली कुकीज़ को साफ करने की अनुमति देने के लिए है, यह किसी भी सुरक्षा से संबंधित भ्रमित नहीं होना चाहिए। – Jacco

0
session_cache_expire(20); 
    session_start(); // NEVER FORGET TO START THE SESSION!!! 
    $inactive = 1200; //20 minutes *60 
    if(isset($_SESSION['start'])) { 
$session_life = time() - $_SESSION['start']; 
if($session_life > $inactive){ 
    header("Location: user_logout.php"); 
} 
    } 
    $_SESSION['start'] = time(); 

    if($_SESSION['valid_user'] != true){ 
    header('Location: ../....php'); 
    }else{ 
बनाया

स्रोत: http://www.daniweb.com/web-development/php/threads/124500

+1

बस पहले जवाब को गुगल करना और स्टैक ओवरफ्लो में चिपकाना इस साइट के बिंदु पर अनुकूल नहीं है। इसके अलावा, session_cache_expire() के पास आपके सत्र की लंबाई से कोई लेना देना नहीं है, इसलिए आपके द्वारा चिपकाए गए उत्तर में गलत जानकारी है। –

+0

@ डेविडबैडबरी डिफ़ॉल्ट रूप से कुकी कुकी_ऑयर स्टोर करती है, यदि कुकी समाप्त हो जाती है, क्लाइंट अनुरोध करते समय session_id तक नहीं पहुंचा जा सकता है। –

5

बस पहले जांचें कि सत्र alrea नहीं है डीई बनाया और अगर एक नहीं बनाते हैं। यहां मैं इसे केवल 1 मिनट के लिए सेट कर रहा हूं।

<?php 
    if(!isset($_SESSION["timeout"])){ 
    $_SESSION['timeout'] = time(); 
    }; 
    $st = $_SESSION['timeout'] + 60; //session time is 1 minute 
?> 

<?php 
    if(time() < $st){ 
    echo 'Session will last 1 minute'; 
    } 
?> 
2
<script type="text/javascript"> 
window.setTimeout("location=('timeout_session.htm');",900000); 
</script> 

हर पृष्ठ के शीर्षक में (साइट उत्पादन में अभी तक नहीं है) साइट परीक्षण के दौरान मेरे लिए काम कर रहा है। एचटीएमएल पेज यह सत्र समाप्त होता है और उपयोगकर्ता को फिर से लॉग इन करने की आवश्यकता के बारे में सूचित करता है। PHP तर्क के साथ खेलने से यह एक आसान तरीका लगता है। मुझे इस विचार पर कुछ टिप्पणियां पसंद आएंगी। किसी भी जाल में मैंने देखा है?

+4

हर कोई जेएस – chuckieDub

+0

का उपयोग नहीं करता है यदि आपके पास एक ही साइट के साथ कई टैब खोले गए हैं, तो आपको एक गतिविधि बनाने के लिए सभी को रीफ्रेश करना होगा, अन्यथा यदि आप 1 टैब में काम करते रहें, तो अन्य टाइमआउट के बाद "timeout_session.htm" दिखाएंगे। बहुत निराशाजनक, विशेष रूप से यदि "timeout_session.htm" सत्र को अनसेट/नष्ट कर रहा है। =) –

1
<?php 
session_start(); 

if (time()<$_SESSION['time']+10){ 
$_SESSION['time'] = time(); 
echo "welcome old user"; 
} 

else{ 
session_destroy(); 
session_start(); 
$_SESSION['time'] = time(); 
echo "welcome new user"; 
} 
?> 
0
<?php 
session_start(); 
if($_SESSION['login'] != 'ok') 
    header('location: /dashboard.php?login=0'); 

if(isset($_SESSION['last-activity']) && time() - $_SESSION['last-activity'] > 600) { 
    // session inactive more than 10 min 
    header('location: /logout.php?timeout=1'); 
} 

$_SESSION['last-activity'] = time(); // update last activity time stamp 

if(time() - $_SESSION['created'] > 600) { 
    // session started more than 10 min ago 
    session_regenerate_id(true); // change session id and invalidate old session 
    $_SESSION['created'] = time(); // update creation time 
} 
?> 
+0

अपने उत्तर पर टिप्पणी करना सुनिश्चित करें और बताएं कि आप कहां और कैसे टाइमआउट जोड़ रहे हैं। – Rias

1

Byterbit समाधान समस्याग्रस्त है क्योंकि:

  1. एक सर्वर साइड कुकी के ग्राहक नियंत्रण समाप्ति होने एक सुरक्षा मुद्दा है।
  2. यदि सर्वर पक्ष पर समाप्ति समय समाप्ति क्लाइंट पक्ष पर टाइमआउट सेट से छोटी है, तो पृष्ठ कुकी की वास्तविक स्थिति को प्रतिबिंबित नहीं करेगा।
  3. विकास चरण में आराम के लिए भी, यह एक समस्या है क्योंकि यह रिलीज चरण पर सही व्यवहार (समय में) को प्रतिबिंबित नहीं करेगा।

कुकीज़ के लिए, session.cookie_lifetime के माध्यम से समाप्ति सेटिंग सही समाधान डिजाइन-वार और सुरक्षा-वार है! सत्र की समाप्ति के लिए, आप session.gc_maxlifetime का उपयोग कर सकते हैं।

session_destroy को कॉल करके कुकीज की समाप्ति से अप्रत्याशित परिणाम मिल सकते हैं क्योंकि वे पहले ही समाप्त हो चुके हैं।

php.ini में परिवर्तन करना एक वैध समाधान है, लेकिन यह पूरे डोमेन के लिए समाप्ति वैश्विक बनाता है जो शायद आप वास्तव में नहीं चाहते हैं - कुछ पृष्ठ कुछ कुकीज़ को दूसरों से अधिक रखने का विकल्प चुन सकते हैं।

संबंधित मुद्दे