2009-08-06 4 views
33

session.gc_maxlifetime और session_cache_expire() के बीच वास्तविक अंतर क्या है?PHP में सत्र समय समाप्ति: सर्वोत्तम प्रथाओं

मान लीजिए कि मैं चाहता हूं कि उपयोगकर्ता सत्र 15 मिनट के गैर-गतिविधि के बाद अमान्य हो (और 15 इसे पहले खोले जाने के बाद नहीं)। इनमें से कौन सा मेरी मदद करेगा?

मुझे यह भी पता है कि मैं session_set_cookie_params() कर सकता हूं जो उपयोगकर्ता की कुकी को कुछ समय में समाप्त करने के लिए सेट कर सकता है। हालांकि, कुकी की समाप्ति और सर्वर पक्ष पर समाप्त होने वाला वास्तविक सत्र समान नहीं है; क्या यह कुकी समाप्त होने पर सत्र को भी हटा देता है?

एक अन्य समाधान मैं हालांकि की है सरल $_SESSION['last_time'] = time() हर अनुरोध पर है, और वर्तमान समय के सत्र की तुलना करें, पर आधारित है कि सत्र को हटाने। मैं उम्मीद कर रहा था कि हालांकि इसे संभालने के लिए एक और "अंतर्निर्मित" तंत्र था।

धन्यवाद।

+0

जैसा कि मैंने कुछ शोध के बाद इस सवाल पर अपने आप को ठोकर खाई, एक [इस stackoverflow सवाल] पर है कि समस्या पर एक बहुत ही गहन जवाब हो सकता है (http://stackoverflow.com/a/1270960/474526), ​​विशेष रूप से क्यों न तो 'session.gc_maxlifetime' अपडेट करना और न ही 'session.cookie_lifetime' विश्वसनीय दृष्टिकोण हैं। –

उत्तर

39

प्रत्येक बार session_start सत्र फ़ाइलों टाइमस्टैम्प (यदि यह मौजूद है) को अद्यतन किया जाता है, जिसे session.gc_maxlifetime पार कर दिया गया है, तो गणना के लिए उपयोग किया जाता है।

अधिक महत्वपूर्ण बात यह है कि आप session.gc_maxlifetime समय पार होने के बाद समाप्त होने के सत्र पर निर्भर नहीं हो सकते हैं।

पीएचपी की अवधि समाप्त हो सत्र पर कचरा संग्रहण चलाता है के बाद वर्तमान सत्र लोड और session.gc_probability और session.gc_divisor का उपयोग करना है यह संभावना है कि कचरा संग्रहण चलेंगे गणना करता है। डिफ़ॉल्ट रूप से इसकी 1% संभावना है।

यदि आपके पास कम संख्या में आगंतुक हैं तो एक संभावित उपयोगकर्ता एक सत्र तक पहुंच सकता है जिसे समाप्त हो जाना चाहिए और हटा दिया जाना चाहिए। यदि आपके लिए यह महत्वपूर्ण है तो आपको सत्र में टाइमस्टैम्प स्टोर करने की आवश्यकता होगी और गणना करें कि उपयोगकर्ता लॉग इन कैसे निष्क्रिय है।

यह उदाहरण session_start बदल देता है और समय समाप्त लागू करता है:

function my_session_start($timeout = 1440) { 
    ini_set('session.gc_maxlifetime', $timeout); 
    session_start(); 

    if (isset($_SESSION['timeout_idle']) && $_SESSION['timeout_idle'] < time()) { 
     session_destroy(); 
     session_start(); 
     session_regenerate_id(); 
     $_SESSION = array(); 
    } 

    $_SESSION['timeout_idle'] = time() + $timeout; 
} 
5

session.gc_maxlifetime पिछली बार सत्र फ़ाइल संशोधित होने पर आधारित है। इसलिए प्रत्येक बार एक सत्र फ़ाइल संशोधित होती है या एक session_start() को एक अलग पृष्ठ में बुलाया जाता है, तो gc_maxlifetime के लिए उलटी गिनती फिर से शुरू होती है और उपयोगकर्ता "लॉग इन" रहता है। यह वह मूल्य है जिसे आप ढूंढ रहे हैं। आप अपने php फाइलों में ini_set() के माध्यम से इस संशोधित करने या php.ini संपादित आप

session_cache_expire (यह करने के लिए उपयोग किया है) केवल नियंत्रित करता है HTTP "समय-सीमा समाप्त" शीर्षक कर सकते हैं। यह हेडर नियंत्रित करता है कि डाउनलोड किए गए पृष्ठ की सामग्री उपयोगकर्ता के ब्राउज़र कैश में कब तक रहती है।

49

मैं कुछ समय बिताया के लिए एक अच्छा जवाब की तलाश में php.ini सर्वर सेटिंग्स कैसे सत्र समाप्त हो सकते हैं। मुझे बहुत सारी जानकारी मिली लेकिन यह पता लगाने में थोड़ी देर लग गई कि क्यों सेटिंग्स उनके तरीके से काम करती हैं। यदि आप मेरे जैसे हैं, तो यह आपके लिए सहायक हो सकता है:

सत्र सर्वर पर कुकीज़ (क्लाइंट के पीसी पर फ़ाइलें) या सर्वर पक्ष के रूप में संग्रहीत हैं । दोनों तरीकों के फायदे और नुकसान हैं।

सर्वर पर संग्रहीत सत्रों के लिए, तीन चर का उपयोग किया जाता है।

session.gc_probability session.gc_divisor session.gc_maxlifetime

(session.gc_probability/session.gc_divisor) संभावना है कि कचरा संग्रहण दिनचर्या चलेंगे पैदा करता है। जब कचरा कलेक्टर चलता है, तो यह सत्र फ़ाइलों के लिए जांच करता है जिन्हें कम से कम session.gc_maxlifetime तक पहुंचाया नहीं गया है और उन्हें हटा दिया गया है।

यह सब बहुत अच्छी तरह से मंच पदों में (यह एक विशेष रूप से!) से समझाया गया है - लेकिन निम्नलिखित प्रश्न सामने आते हैं करते हैं:

1.) कैसे है कि संभावना लागू किया जाता है? सर्वर पासा रोल कब करता है?

ए: सर्वर पर प्रत्येक सक्रिय सत्र के दौरान सत्र_start() को हर बार पासा रोल करता है। तो इसका मतलब यह है आप मोटे तौर पर एक बार हर 100 बार के लिए है कि session_start() कहा जाता है अगर आप session.gc_probability = 1 और session.gc_divisor = 100

2.) क्या होता है के डिफ़ॉल्ट है कचरा कलेक्टर रन देखना चाहिए कम मात्रा सर्वर पर?

ए: जब session_start() इसे कॉल किया जाता है तो पहले सत्र को रीफ्रेश करता है और आपके लिए उपलब्ध सत्र मान बनाता है। यह सर्वर पर आपकी सत्र फ़ाइल पर समय अपडेट करता है। यह तब पासा रोल करता है और यदि यह जीतता है (100 मौकों में से 1) यह कचरा कलेक्टर कहता है। कचरा कलेक्टर तब सभी सत्र आईडी फाइलों की जांच करता है और देखता है कि कोई है जो हटाने के लिए योग्य हैं।

तो इसका मतलब है कि यदि आप सर्वर पर एकमात्र व्यक्ति हैं, तो आपका सत्र कभी निष्क्रिय नहीं होगा और ऐसा लगता है कि सेटिंग बदलने के दौरान प्रभाव नहीं है। आइए मान लें कि आप session.gc_maxlifetime को 10 और session.gc_probability से 100 में बदलते हैं। इसका मतलब है कि कचरा कलेक्टर चलाने का 100% मौका है और यह किसी भी सत्र फ़ाइलों को साफ़ कर देगा जो पिछले 10 सेकंड में नहीं पहुंचे हैं ।

यदि आप सर्वर पर केवल एक ही हैं, तो आपका सत्र हटाया नहीं जाएगा। निष्क्रिय होने के लिए आपको कम से कम 1 अन्य सक्रिय सत्र चलाने की आवश्यकता है।

तो मूल रूप से, कम मात्रा सर्वर पर या एक कम मात्रा समय में - यह session.gc_maxlifetime की तुलना में बहुत लंबे समय तक से पहले कचरा कलेक्टर वास्तव में चलाता है और सत्र वास्तव में नष्ट हो जाती हैं हो सकता है। और यह जानने के बिना कि यह कैसे काम करता है, यह आपके लिए पूरी तरह से यादृच्छिक दिखाई दे सकता है।

3.) वे संभावना का उपयोग क्यों करते हैं?

ए: प्रदर्शन। उच्च वॉल्यूम सर्वर पर आप कचरा कलेक्टर सत्र_स्टार्ट() के प्रत्येक अनुरोध पर चलाना नहीं चाहते हैं। यह सर्वर को धीमा कर देगा। तो आपके सर्वर वॉल्यूम के आधार पर, आप को बढ़ा सकते हैं या कचरा कलेक्टर चलाने की संभावना को कम कर सकते हैं।

मुझे आशा है कि यह आपके लिए चीजों को एक साथ जोड़ देगा। यदि आप मेरे जैसे हैं और आपने सत्र का प्रयास किया है।gc_maxlifetime और ऐसा लगता है कि यह काम नहीं कर रहा है (क्योंकि आपने इसे किसी विकास सर्वर पर बाहर करने की कोशिश की है ताकि किसी को भी परेशान न किया जा सके), तो यह पोस्ट आशा करता है कि आपको कुछ सिर खरोंच से बचाया गया है।

शुभकामनाएं!

+3

बहुत जानकारीपूर्ण जवाब! आधिकारिक PHP दस्तावेज़ों में होना चाहिए। धन्यवाद! –

+0

बहुत स्पष्ट उत्तर ... लेकिन मैं यह इंगित करना चाहता हूं कि यदि आप PHP के डिफ़ॉल्ट फ़ाइल-आधारित सत्रों का उपयोग करते हैं, तो भी कुकी को उपयोगकर्ता के ब्राउज़र पर भेजा जाता है। यह एक सत्र कुकी है (परंपरागत रूप से ये समाप्त हो जाती है जब वे टैब/विंडो बंद करते हैं) और बस उनके सत्र पहचानकर्ता शामिल होते हैं। तो सत्र 'समस्याएं' सर्वर सेटिंग्स तक ही सीमित नहीं हो सकती हैं। यदि उपयोगकर्ता का ब्राउज़र टैब/विंडो के करीब इस कुकी को 'याद रखना' है, तो वे सत्र खो सकते हैं जिन्हें वे अन्यथा रखने की उम्मीद करते हैं। समान रूप से, इस कुकी की सेटिंग्स के साथ आपकी गड़बड़ी सत्र को जीवंत रखने की उनकी क्षमता को प्रभावित कर सकती है। – simonhamp

+0

http://www.appnovation.com/blog/session-garbage-collection-php ... डेबियन/उबंटू डिस्ट्रो में, डिफ़ॉल्ट रूप से PHP अपने सत्र कचरा संग्रहण तंत्र को अक्षम करता है। इसके बजाए, यह प्रत्येक आधे घंटे में क्रॉन नौकरी चलाता है (स्क्रिप्ट /etc/cron.d/php5 देखें)/var/lib/php5/निर्देशिका में सत्र फ़ाइलों को शुद्ध करने के लिए। – renergy

1

वर्तमान मूल्यों की जाँच करने के लिए, इस कोड को उपयोगी होगा:

$gc_maxlifetime = ini_get('session.gc_maxlifetime'); 
$gc_probability = ini_get('session.gc_probability'); 
$gc_divisor  = ini_get('session.gc_divisor'); 

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

  • कोई संबंधित समस्या नहीं^_^