2011-12-23 20 views
7

मैं php सत्र के बारे में कुछ में कुछ सवाल है:कुछ सवाल

  1. के बाद से session.gc_maxlifetime के लिए डिफ़ॉल्ट मान 24 मिनट तो किसी भी सत्र फ़ाइल कि संशोधित नहीं है इसका मतलब है कि है 24 मिनट के लिए हटा दिया जाएगा और सत्र स्वचालित रूप से समाप्त हो जाएगा।

  2. यदि मैं अपने कोड में session_destroy() का उपयोग करता हूं तो सत्र अनसेट हो जाएगा, लेकिन सत्र फ़ाइल स्वयं को तब तक नहीं हटाया जाएगा जब तक कि अंतिम बार संशोधित नहीं किया गया था।

  3. सत्र के जीवनकाल (24 मिनट से अधिक) का विस्तार करने का एकमात्र तरीका session.gc_maxlifetime को एक बड़े मूल्य में विस्तारित करना है।

क्या ये सभी सही हैं या क्या मुझे इसके बारे में कुछ गलत लगता है?

यदि मैं अपने सत्र डेटाबेस में संग्रहीत करता हूं (session_set_save_handler() का उपयोग करके) क्या ये सभी नियम उनके लिए लागू होंगे?

उत्तर

5
  1. लगभग। फ़ाइल (सत्र) तुरंत हटाया नहीं जाएगा, यह session.gc_probability और session.gc_divisor द्वारा निर्धारित किया गया है।

  2. नहीं है, सत्र समाप्त हो जाएगा, लेकिन जैसा कि पिछले बिंदु में कहा गया है सत्र फ़ाइल का विलोपन निर्धारित किया जाता है

  3. कि आमतौर पर सही है, लेकिन यदि आप अपने स्वयं सत्र हैंडलर लागू करने के लिए थे, तो आप कर सकते थे यहां तक ​​कि इस तरह से session.gc_maxlifetime कि नजरअंदाज कर दिया है

DB में सत्र भंडारण उन नियमों में बदलाव नहीं होना चाहिए सत्र की समाप्ति के व्यवहार में परिवर्तन है, लेकिन उन्हें एक छोटे से खिंचाव सकता है, यदि आप चाहते थे।

संपादित करें:

इस तरह आप अपने स्वयं के सत्र हैंडलर रजिस्टर कर सकते हैं (हैंडलर एक वर्ग जा रहा है) और फिर जो कुछ भी आप इसके साथ चाहते

सबसे पहले करते हैं, लगता है कि हम एक वर्ग है मोटे तौर पर है, कि हमारे आवेदन के लिए सत्र संभालने जा रहा है।

class MySession { 
    function open($save_path, $session_name) { 
    } 

    function close() { 
    } 

    function read($id) { 
    } 

    function write($id, $sess_data) { 
    } 

    function destroy($id) { 
    } 

    function gc($maxlifetime) { 
    } 
} 

php में हैंडलर रजिस्टर करने के लिए, आप केवल हमारे मामले में, session_set_save_handler समारोह कॉल करने के लिए इस तरह की जरूरत है: वहाँ वास्तव में बेहतर तरीके हैंडलर ही है, आप कर सकते थे रजिस्टर करने के लिए कर रहे हैं

// register the session handler 
$sess = new MySession(); 
session_set_save_handler(array($sess, 'open'), 
        array($sess, 'close'), 
        array($sess, 'read'), 
        array($sess, 'write'), 
        array($sess, 'destroy'), 
        array($sess, 'gc')); 

ध्यान दें कि यहां तक ​​कि अपनी कक्षा के निर्माता, या कई अन्य तरीकों से भी ऐसा करें। लेकिन मुझे लगता है कि यह मुद्दा नहीं है।

महत्वपूर्ण बात यह है कि हालांकि PHP आपको सत्र प्रबंधन तंत्र के मानक व्यवहार से संबंधित आवश्यक चर देता है, आपको इसका सम्मान नहीं करना है (ऐसा नहीं है कि मैं इसकी अनुशंसा करता हूं)।

नीचे एक टिप्पणी का जवाब करने के लिए, maxlifetime पैरामीटर अनदेखी करने के लिए, आप पर ध्यान न दें कि आपके जीसी विधि और उपयोग में जो कुछ भी आप आवश्यक/सही समझे, उदाहरण के लिए (db छद्म कोड का उपयोग कर):

function gc($maxlifetime) { 
    $sql = "DELETE * FROM MySession WHERE lastAccess < NOW()-3600"; 
    // execute the query, say I have PDO instance in $dbh variable 
    $dbh->execute($sql); 
} 

देखा, आप बस इसे स्वयं करके करके PHP सत्र सेटिंग्स को पूरी तरह से बाधित कर चुके हैं।

+0

उत्तर के लिए धन्यवाद। एक और सवाल: क्या आप अपने उत्तर में बिंदु 3 के बारे में अधिक जानकारी दे सकते हैं? वर्तमान में मैं सत्र प्रबंधन के लिए डिफ़ॉल्ट कॉन्फ़िगरेशन का उपयोग कर रहा हूं। मेरे पास php.ini पर कोई नियंत्रण नहीं है क्योंकि यह एक साझा सर्वर है, इसलिए मैं session.gc_maxlifetime को संशोधित नहीं कर सकता। मैं सत्रों को संग्रहीत करने और प्रत्येक सत्र के जीवनकाल को स्वतंत्र रूप से नियंत्रित करने के लिए डेटाबेस का उपयोग करने के बारे में सोच रहा हूं (मुझे याद रखने के विकल्प का उपयोग करके)। स्पष्टीकरण के लिए – Songo

+0

धन्यवाद। आपने मुझे खुश कर दिया :) – Songo

1
  1. सही है, session.gc_maxlifetime जब सत्र समाप्त हो
  2. session_destroy सत्र फ़ाइल
  3. हाँ, यह एक ही रास्ता नहीं हटाता है सत्र फ़ाइल को नष्ट करेगा। Session.gc_divider के साथ खेलने वाले कचरा संग्रह को अक्षम करने के बाद और अपना स्वयं का कचरा संग्रह बनाने के लिए एक स्क्रिप्ट बनाएं, डेबियन आधारित डिस्ट्रो वास्तव में डिफ़ॉल्ट रूप से ऐसा करता है।

कुछ डेटाबेस में सत्र संग्रहीत करना उन नियमों को नहीं बदलेगा।

+0

आपके उत्तर के लिए धन्यवाद। मेरे पास php.ini पर कोई नियंत्रण नहीं है क्योंकि यह एक साझा सर्वर है, इसलिए मैं session.gc_maxlifetime को संशोधित नहीं कर सकता। मैं सत्रों को स्टोर करने और प्रत्येक सत्र के जीवनकाल को स्वतंत्र रूप से नियंत्रित करने के लिए डेटाबेस का उपयोग करने के बारे में सोच रहा हूं (मुझे याद रखने के विकल्प का उपयोग करके)। क्या यह व्यवहार्य है? – Songo

+1

हां, यह संभव है। – RageZ

+0

कोई भी ट्यूटोरियल या उदाहरण वास्तव में मदद करेंगे :)। मैं वास्तव में ज़ेंड फ्रेमवर्क का उपयोग कर रहा हूं ताकि डेटाबेस में सत्रों को संग्रहीत करना आसान हो। समस्या यह है कि स्वतंत्र सत्र जीवनकाल को विस्तारित करने के बारे में कुछ भी नहीं बताया गया है। मैंने सोचा कि याद है() फ़ंक्शन चाल करेगा, लेकिन यह केवल कुकी का जीवनकाल बढ़ाता है। – Songo

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