परिचय: "मेरा सत्र क्यों नहीं मरता?"
\n\nकल्पना करें: आप एक ऑनलाइन स्टोर, एडमिन पैनल या व्यक्तिगत खाता लिख रहे हैं। उपयोगकर्ता लॉग इन करता है, काम करता है, कॉफी पीने चला जाता है - और एक घंटे बाद भी उसका सत्र जीवित है। कार्ट में डेटा लटका हुआ है, एक्सेस खुला है। यह न केवल असुविधाजनक है, बल्कि खतरनाक भी है। खासकर यदि साइट भुगतान डेटा के साथ काम करती है।
\n\nप्रश्न "How do I expire a PHP session after 30 minutes?" Stack Overflow पर सबसे लोकप्रिय प्रश्नों में से एक है (दसियों हज़ार व्यूज़)। और कोई आश्चर्य नहीं: नौसिखिए डेवलपर्स अक्सर सोचते हैं कि केवल session.gc_maxlifetime सेट करना पर्याप्त है - और सब कुछ काम करेगा। और फिर वे आश्चर्यचकित होते हैं कि सत्र घंटों तक क्यों जीवित रहता है।
इस लेख में, हम 4 वास्तविक दृष्टिकोणों पर चर्चा करेंगे कि PHP सत्र को ठीक 30 मिनट में कैसे समाप्त किया जाए। आप जानेंगे कि मानक सेटिंग्स क्यों विफल हो सकती हैं, और अपने कार्य के लिए कौन सी विधि चुननी है। चलिए शुरू करते हैं!
\n\nथोड़ा सिद्धांत: PHP सत्र समय का प्रबंधन कैसे करता है
\n\nकोड लिखने से पहले, दो तंत्रों को समझना महत्वपूर्ण है जो सत्र की "मृत्यु" को प्रभावित करते हैं:
\n\n- \n
- सत्र कुकी का जीवनकाल - ब्राउज़र सत्र पहचानकर्ता (PHPSESSID) को कितने समय तक संग्रहीत करता है। पैरामीटर
session.cookie_lifetimeद्वारा नियंत्रित किया जाता है। \n - सर्वर पर डेटा का जीवनकाल - सत्र फ़ाइल /tmp फ़ोल्डर में कितने समय तक रहती है।
session.gc_maxlifetimeद्वारा नियंत्रित किया जाता है। \n
समस्या यह है कि कचरा संग्रहकर्ता (GC - garbage collector) संभाव्य रूप से चलता है। डिफ़ॉल्ट रूप से, यह 1% अनुरोधों पर चलता है। इसका मतलब है कि भले ही gc_maxlifetime = 1800 (30 मिनट) हो, सत्र एक और घंटे तक लटका रह सकता है जब तक कि GC उस तक नहीं पहुँचता।
इसलिए केवल सर्वर सेटिंग पर निर्भर रहना एक बुरा विचार है। समय को "मैन्युअल रूप से" जांचना आवश्यक है।
\n\nविधि संख्या 1. क्लासिक: सत्र में समय की जाँच (अनुशंसित)
\n\nयह सबसे विश्वसनीय और पारदर्शी तरीका है। आप स्वयं सत्र में अंतिम गतिविधि का टाइमस्टैम्प संग्रहीत करते हैं, और प्रत्येक अनुरोध पर जाँच करते हैं कि 30 मिनट बीत गए हैं या नहीं।
\n\n<?php\nsession_start();\n\n// सत्र का जीवनकाल सेट करें - 30 मिनट (1800 सेकंड)\n$timeout_duration = 1800;\n\n// यदि सत्र में टाइमस्टैम्प है और वह समाप्त हो गया है\nif (isset($_SESSION['LAST_ACTIVITY']) && \n (time() - $_SESSION['LAST_ACTIVITY']) > $timeout_duration) {\n // सत्र को नष्ट करें\n session_unset();\n session_destroy();\n // लॉगिन पेज पर रीडायरेक्ट करें\n header("Location: login.php?timeout=1");\n exit;\n}\n\n// टाइमस्टैम्प अपडेट करें (यदि उपयोगकर्ता सक्रिय है)\n$_SESSION['LAST_ACTIVITY'] = time();\n?>\n\nलाभ:
\n- \n
- पूर्ण नियंत्रण: निष्क्रियता के ठीक 30 मिनट बाद सत्र समाप्त हो जाएगा। \n
- PHP सेटिंग्स और कचरा संग्रहकर्ता पर निर्भर नहीं करता। \n
- साइट के विभिन्न अनुभागों के लिए समय बदलना आसान (जैसे, एडमिन पैनल - 15 मिनट, उपयोगकर्ता - 60 मिनट)। \n
नुकसान:
\n- \n
- प्रत्येक पृष्ठ पर जाँच जोड़ने की आवश्यकता है (या एक सामान्य आरंभीकरण फ़ाइल में डालें)। \n
- यदि उपयोगकर्ता पृष्ठ खुला रखता है लेकिन क्लिक नहीं करता - सत्र समाप्त हो जाएगा। कुछ परिदृश्यों (लंबा फॉर्म) के लिए, यह एक नुकसान है। \n
विधि संख्या 2. संयुक्त: gc_maxlifetime + cookie_lifetime
\n\nयदि आप मैन्युअल जाँच नहीं लिखना चाहते हैं, तो आप PHP को "आउट ऑफ द बॉक्स" कॉन्फ़िगर करने का प्रयास कर सकते हैं। लेकिन बारीकियों को याद रखें।
\n\n// स्क्रिप्ट की शुरुआत में, session_start() से पहले\n$lifetime = 1800; // 30 मिनट\n\n// सत्र कुकी का जीवनकाल सेट करें\nsession_set_cookie_params($lifetime);\n\n// सर्वर पर डेटा का अधिकतम जीवनकाल सेट करें\nini_set('session.gc_maxlifetime', $lifetime);\n\n// अब सत्र शुरू करें\nsession_start();\n\nअतिरिक्त - GC को अधिक बार चलाने के लिए, प्रारंभ की संभावना कम करें:
\n\nini_set('session.gc_probability', 1);\nini_set('session.gc_divisor', 1); // GC हर अनुरोध पर चलेगा