PHP में सेशन टाइमआउट कैसे बदलें?


154

मैं php में सत्र टाइमआउट का विस्तार करना चाहूंगा

मुझे पता है कि php.ini फ़ाइल को संशोधित करके ऐसा करना संभव है। लेकिन मेरे पास इसकी पहुंच नहीं है।

तो क्या यह केवल php कोड के साथ करना संभव है?



1
संबंधित, यह php.ini में है, लेकिन मुझे लगता है कि यो @ ini_set का उपयोग कर सकते हैं जैसे @matino ने कहा stackoverflow.com/questions/520237/…
J-Rou

जवाबों:


324

यदि आप सख्त गारंटी चाहते हैं तो सत्र टाइमआउट एक धारणा है जिसे कोड में लागू किया जाना है; यही एकमात्र तरीका है कि आप पूरी तरह से निश्चित हो सकते हैं कि कोई भी सत्र निष्क्रियता के एक्स मिनट के बाद कभी भी नहीं बचेगा।

यदि इस आवश्यकता को कम करना थोड़ा स्वीकार्य है और आप अवधि के लिए एक सख्त सीमा के बजाय एक कम बाध्य रखने के साथ ठीक हैं , तो आप ऐसा आसानी से और कस्टम तर्क लिखे बिना कर सकते हैं।

तनावमुक्त वातावरण में सुविधा: कैसे और क्यों

यदि आपके सत्र कुकीज़ के साथ कार्यान्वित किए जाते हैं (जो वे संभवतः हैं), और यदि ग्राहक दुर्भावनापूर्ण नहीं हैं, तो आप कुछ मापदंडों को जोड़कर सत्र की अवधि के लिए एक ऊपरी बाध्य सेट कर सकते हैं। आप कुकीज़ के साथ PHP के डिफ़ॉल्ट सत्र से निपटने का उपयोग कर रहे हैं, तो स्थापित करने session.gc_maxlifetimeके साथ-साथ session_set_cookie_paramsइस तरह आप के लिए काम करना चाहिए:

// server should keep session data for AT LEAST 1 hour
ini_set('session.gc_maxlifetime', 3600);

// each client should remember their session id for EXACTLY 1 hour
session_set_cookie_params(3600);

session_start(); // ready to go!

यह कम से कम एक घंटे की निष्क्रियता के लिए सत्र डेटा रखने के लिए सर्वर को कॉन्फ़िगर करने और आपके क्लाइंट को निर्देश देता है कि वे एक ही समय अवधि के बाद अपने सत्र आईडी को "भूल" जाएं। अपेक्षित परिणाम प्राप्त करने के लिए इन दोनों चरणों की आवश्यकता है।

  • यदि आप ग्राहकों को एक घंटे के बाद अपने सत्र आईडी को भूलने के लिए नहीं कहते हैं (या यदि ग्राहक दुर्भावनापूर्ण हैं और आपके निर्देशों को अनदेखा करना चुनते हैं) तो वे उसी सत्र आईडी का उपयोग करते रहेंगे और इसकी प्रभावी अवधि गैर-नियतात्मक होगी। ऐसा इसलिए है क्योंकि जिन सत्रों का जीवनकाल सर्वर की ओर समाप्त हो गया है, वे तुरंत कचरा एकत्र नहीं करते हैं, लेकिन केवल जब भी सत्र जीसी में प्रवेश होता है

    जीसी एक संभावित महंगी प्रक्रिया है, इसलिए आमतौर पर संभावना कम या अधिक शून्य होती है (बड़ी संख्या में हिट होने वाली वेबसाइट संभवतः संभाव्य जीसी को पूरी तरह से त्याग देगी और इसे प्रत्येक एक्स मिनट में पृष्ठभूमि में होने का समय निर्धारित करेगी)। दोनों ही मामलों में (गैर-सहयोगी ग्राहकों को मानते हुए) प्रभावी सत्र जीवनकाल के लिए निम्न सीमा होगी session.gc_maxlifetime, लेकिन ऊपरी सीमा अप्रत्याशित होगी।

  • यदि आप session.gc_maxlifetimeएक ही समय अवधि में सेट नहीं करते हैं, तो सर्वर इससे पहले निष्क्रिय सत्र डेटा को छोड़ सकता है; इस मामले में, एक ग्राहक जो अभी भी अपने सत्र आईडी को याद रखता है, उसे प्रस्तुत करेगा लेकिन सर्वर को उस सत्र से जुड़ा कोई डेटा नहीं मिलेगा, प्रभावी रूप से ऐसा व्यवहार करना जैसे कि सत्र अभी शुरू हुआ था।

महत्वपूर्ण वातावरण में निश्चितता

आप सत्र तर्क पर ऊपरी बाध्यता रखने के लिए कस्टम तर्क का उपयोग करके चीजों को पूरी तरह से नियंत्रित कर सकते हैं ; एक साथ एक कड़ी सेटिंग में इस परिणाम के ऊपर से निचले बाउंड के साथ।

सत्र के बाकी आंकड़ों के साथ ऊपरी बाउंड को बचाकर ऐसा करें:

session_start(); // ready to go!

$now = time();
if (isset($_SESSION['discard_after']) && $now > $_SESSION['discard_after']) {
    // this session has worn out its welcome; kill it and start a brand new one
    session_unset();
    session_destroy();
    session_start();
}

// either new or old, it should live at most for another hour
$_SESSION['discard_after'] = $now + 3600;

सत्र आईडी दृढ़ता

अब तक हम प्रत्येक सत्र आईडी के सटीक मूल्यों के साथ बिल्कुल भी चिंतित नहीं हैं, केवल इस आवश्यकता के साथ कि डेटा तब तक मौजूद होना चाहिए जब तक हमें उनकी आवश्यकता है। इस बात से अवगत रहें कि सत्र की अनुपस्थिति में (अनुपस्थित) मामला आपके लिए महत्वपूर्ण है, आवश्यकता होने पर उन्हें फिर से बनाने के लिए ध्यान रखा जाना चाहिए session_regenerate_id


प्रश्न: यदि इसे कॉल करते हैं, तो हर मिनट में jsut कहते हैं, क्या यह इसकी सीमा बढ़ाएगा? उदाहरण 10:00 पर मैंने इसे कॉल किया तो इसकी सीमा 11:00 होगी, 1 मील के बाद 10:01, क्या यह सीमा 11:01 होगी?
वनोफाइंड

@oneofakind: यदि आप वास्तव में क्या कहते हैं?
जॉन

1
ये वाले: ini_set ('session.gc_maxlifetime', 3600); session_set_cookie_params (3600);
एकोफाइंड

@oneofakind: हाँ, लेकिन केवल तभी जब आप कॉल session_start()करते हैं (अन्यथा कोई प्रभाव नहीं होता है) और केवल तभी जब आप हमेशा उन दो को कॉल करते हैं session_start(अन्यथा gc_maxlifetimeवर्तमान में खुले सभी सत्रों को प्रभावित करने की क्षमता है, जबकि session_set_cookie_paramsकेवल एक नए सत्र को प्रभावित कर सकता है जो इसके साथ शुरू होता है वर्तमान अनुरोध)।
जॉन

अगर मैं सेशन_स्टार्ट () को कॉल करता हूं, तो क्या यह मेरी $ _SESSION में सब कुछ रीसेट कर देगा? यदि आपके द्वारा "सभी सत्रों को प्रभावित करने की क्षमता है" तो कैसे? उत्तर के लिए धन्यवाद।
वनोफाइंड

33

यदि आप PHP के डिफ़ॉल्ट सत्र हैंडलिंग का उपयोग करते हैं, तो php.ini को बदलने के लिए सभी प्लेटफार्मों में सत्र अवधि को मज़बूती से बदलने का एकमात्र तरीका है । ऐसा इसलिए है क्योंकि कुछ प्लेटफार्मों में, कचरा संग्रह एक स्क्रिप्ट के माध्यम से कार्यान्वित किया जाता है जो हर निश्चित समय (एक क्रोन स्क्रिप्ट) को चलाता है जो सीधे php.ini से पढ़ता है , और इसलिए इसे रन टाइम पर बदलने की कोई भी कोशिश, जैसे कि ini_set(), के माध्यम से अविश्वसनीय और सबसे अधिक संभावना है। काम नहीं करेगा।

उदाहरण के लिए, डेबियन लिनक्स सिस्टम में, PHP का आंतरिक कचरा संग्रह session.gc_probability=0कॉन्फ़िगरेशन में डिफ़ॉल्ट रूप से सेटिंग द्वारा अक्षम किया गया है, और इसके बजाय /etc/cron.d/php के माध्यम से किया जाता है, जो XX: 09 और XX: 39 (जो है) पर चलता है हर आधे घंटे में)। यह क्रॉन जॉब सत्र से पुराने सत्रों की तलाश करता है। कॉन्फ़िगरेशन में निर्दिष्ट gg_maxlifetime , और यदि कोई पाया जाता है, तो वे हटा दिए जाते हैं। परिणामस्वरूप, इन प्रणालियों ini_set('session.gc_maxlifetime', ...)में अनदेखी की जाती है। यह भी बताता है कि इस सवाल में क्यों: PHP सत्र बहुत जल्दी से बाहर निकलता है , ओपी को एक मेजबान में समस्याएं थीं लेकिन एक अलग मेजबान पर स्विच करने पर समस्याएं समाप्त हो गईं।

इसलिए, यह देखते हुए कि आपके पास php.ini तक पहुंच नहीं है , यदि आप इसे आंशिक रूप से करना चाहते हैं, तो डिफ़ॉल्ट सत्र हैंडलिंग का उपयोग करना एक विकल्प नहीं है। जाहिर है, कुकी के जीवनकाल का विस्तार करना आपके मेजबान के लिए पर्याप्त था, लेकिन यदि आप एक समाधान चाहते हैं जो कि मेजबानों को स्विच करने पर भी मज़बूती से काम करता है, तो आपको एक अलग विकल्प का उपयोग करना होगा।

उपलब्ध वैकल्पिक तरीकों में शामिल हैं:

  1. PHP में निर्दिष्ट के रूप में एक अलग निर्देशिका में या डेटाबेस में अपने सत्र को बचाने के लिए PHP में एक अलग सत्र (सहेजें) हैंडलर सेट करें : कस्टम सत्र हैंडलर (PHP मैनुअल) , ताकि क्रोन नौकरी उस तक न पहुंचे, और केवल PHP के आंतरिक कचरा संग्रह होता है। यह विकल्प शायद का उपयोग कर सकते ini_set()सेट करने के लिए session.gc_maxlifetime लेकिन मैं सिर्फ अनदेखी करने के लिए पसंद करते हैं maxlifetime मेरे में पैरामीटर gc()कॉलबैक और अपने दम पर अधिकतम जीवनकाल निर्धारण करते हैं।

  2. पूरी तरह से PHP के आंतरिक सत्र से निपटने और अपने स्वयं के सत्र प्रबंधन को लागू करने के बारे में भूल जाओ। इस पद्धति के दो मुख्य नुकसान हैं: आपको अपने स्वयं के वैश्विक सत्र चर की आवश्यकता होगी, इसलिए आप $_SESSIONसुपरग्लोबल का लाभ खो देते हैं , और इसे अधिक कोड की आवश्यकता होती है इस प्रकार बग और सुरक्षा दोषों के लिए अधिक अवसर होते हैं। सबसे महत्वपूर्ण, सत्र पहचानकर्ता को क्रिप्टोग्राफिक रूप से सुरक्षित यादृच्छिक या छद्म आयामी संख्याओं से उत्पन्न किया जाना चाहिए ताकि सत्र ID की पूर्वानुमेयता (संभावित सत्र अपहरण के लिए अग्रणी) से बचा जा सके, और जो कि PHP के साथ आंशिक रूप से करना इतना आसान नहीं है। मुख्य लाभ यह है कि यह सभी प्लेटफार्मों में लगातार काम करेगा और कोड पर आपका पूर्ण नियंत्रण है। वह तरीका जैसे phpBB फोरम सॉफ्टवेयर द्वारा लिया गया दृष्टिकोण (कम से कम संस्करण 1; मैं हाल के संस्करणों के बारे में निश्चित नहीं हूं)।

के लिए प्रलेखनsession_set_save_handler() में (1) का एक उदाहरण है । उदाहरण लंबा है, लेकिन मैं इसे यहां फिर से प्रस्तुत करूंगा, सत्र की अवधि बढ़ाने के लिए आवश्यक संशोधनों के साथ। session_set_cookie_params()कुकी के जीवनकाल को बढ़ाने के लिए भी शामिल करने पर ध्यान दें ।

<?php
class FileSessionHandler
{

    private $savePath;
    private $lifetime;

    function open($savePath, $sessionName)
    {
        $this->savePath = 'my_savepath'; // Ignore savepath and use our own to keep it safe from automatic GC
        $this->lifetime = 3600; // 1 hour minimum session duration
        if (!is_dir($this->savePath)) {
            mkdir($this->savePath, 0777);
        }

        return true;
    }

    function close()
    {
        return true;
    }

    function read($id)
    {
        return (string)@file_get_contents("$this->savePath/sess_$id");
    }

    function write($id, $data)
    {
        return file_put_contents("$this->savePath/sess_$id", $data) === false ? false : true;
    }

    function destroy($id)
    {
        $file = "$this->savePath/sess_$id";
        if (file_exists($file)) {
            unlink($file);
        }

        return true;
    }

    function gc($maxlifetime)
    {
        foreach (glob("$this->savePath/sess_*") as $file) {
            if (filemtime($file) + $this->lifetime < time() && file_exists($file)) { // Use our own lifetime
                unlink($file);
            }
        }

        return true;
    }
}

$handler = new FileSessionHandler();
session_set_save_handler(
    array($handler, 'open'),
    array($handler, 'close'),
    array($handler, 'read'),
    array($handler, 'write'),
    array($handler, 'destroy'),
    array($handler, 'gc')
    );

// the following prevents unexpected effects when using objects as save handlers
register_shutdown_function('session_write_close');

session_set_cookie_params(3600); // Set session cookie duration to 1 hour
session_start();
// proceed to set and retrieve values by key from $_SESSION

दृष्टिकोण (2) अधिक जटिल है; मूल रूप से, आपको अपने दम पर सभी सत्र कार्यों को फिर से लागू करना होगा। मैं यहाँ विवरण में नहीं जाऊँगा।


क्या कोई इसकी पुष्टि कर सकता है?
ओली

@ ओली: सरसरी तौर पर पढ़ी गई बातों के बाद यह सही लगता है। आप stackoverflow.com/questions/520237/… को भी देखना चाह सकते हैं , लेकिन यदि आपके पास php.iniअपने व्यावहारिक विकल्पों तक पहुंच नहीं है, तो आप गंभीर रूप से प्रतिबंधित हैं।
जॉन

इसके अलावा, Ubuntu 14 पर ऐसा लगता है कि /usr/lib/php5/maxlifetime24 मिनट से नीचे के मूल्य की गणना नहीं की जाएगी। इसलिए आप अपने सत्र के समय को उससे कम पर सेट नहीं कर सकते।
हेनरी

"पूरी तरह से PHP के आंतरिक सत्र से निपटने और अपने स्वयं के सत्र प्रबंधन को लागू करने के बारे में भूल जाओ।" अच्छा भगवान आदमी, वह खतरनाक सलाह है। सुरक्षा दुःस्वप्न अनिवार्य रूप से परिणाम देगा।
कजकाई

@Kzqai मैं यह भी नोट करता हूं कि "इसे अधिक कोड की आवश्यकता है और इस प्रकार बग और सुरक्षा दोषों के लिए अधिक अवसर हैं"। यह सलाह नहीं है, मैं विकल्पों की गणना कर रहा हूं, लेकिन अगर आपके पास इसे सुधारने का सुझाव है, तो कृपया करें।
पेड्रो गिमेनो

3

Plesk के उपयोग से किसी के भी मुद्दे को लेकर किसी के लिए टिप्पणी जोड़ना क्योंकि यह मुझे पागल बना रहा था, अपने PHP स्क्रिप्ट से session.gc_maxlifetime सेटिंग कर रहा था, क्योंकि Plesk के पास यह कचरा संग्रह स्क्रिप्ट नहीं है, जो क्रॉन से संचालित है।

मैंने इस मुद्दे से बचने के लिए क्रोन जॉब को प्रतिदिन स्थानांतरित करने के लिए नीचे दिए गए लिंक पर पोस्ट किए गए समाधान का उपयोग किया, फिर शीर्ष उत्तर को काम करना चाहिए:

mv /etc/cron.hourly/plesk-php-cleanuper /etc/cron.daily/

https://websavers.ca/plesk-php-sessions-timing-earlier-expected


3

$_SESSION['login_time'] = time();पिछले प्रमाणीकरण पृष्ठ में रखें । और हर दूसरे पेज पर नीचे की ओर छीन लिया गया है जहां आप सत्र टाइम-आउट की जांच करना चाहते हैं।

if(time() - $_SESSION['login_time'] >= 1800){
    session_destroy(); // destroy session.
    header("Location: logout.php");
    die(); // See https://thedailywtf.com/articles/WellIntentioned-Destruction
    //redirect if the page is inactive for 30 minutes
}
else {        
   $_SESSION['login_time'] = time();
   // update 'login_time' to the last time a page containing this code was accessed.
}

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


2

साझाकरण होस्टिंग सर्वर के लिए सिर्फ एक सूचना या डोमेन = पर जोड़ा गया

अपनी सेटिंग्स के लिए काम करने के लिए आपके पास जोड़ा गया डोमेन के लिए php_value session.save_path "folderA / sessionA" का उपयोग करके एक अलग सेव सेशन होना चाहिए।

इसलिए अपने रूट सर्वर पर एक फोल्डर बनाएं, public_html में नहीं और बाहर से प्रचारित होने के लिए प्रचार न करें। मेरे cpanel / सर्वर ने फ़ोल्डर अनुमतियों को ठीक करने के लिए 0700 काम किया। एक कोशिश दें ...

  • php कोड =

     #Session timeout, 2628000 sec = 1 month, 604800 = 1 week, 57600 = 16 hours, 86400 = 1 day
     ini_set('session.save_path', '/home/server/.folderA_sessionsA');
     ini_set('session.gc_maxlifetime', 57600); 
     ini_set('session.cookie_lifetime', 57600);
     ini_set('session.cache_expire', 57600);
     ini_set('session.name', 'MyDomainA');

session_start () से पहले;

या

  • .htaccess =

     php_value session.save_path /home/server/.folderA_sessionsA
     php_value session.gc_maxlifetime 57600
     php_value session.cookie_lifetime 57600
     php_value session.cache_expire 57600
     php_value session.name MyDomainA

कई शोध और परीक्षण के बाद इस साझा cpanel / php7 सर्वर के लिए ठीक काम किया। बहुत धन्यवाद: NoiS


1

यदि आपके पास php.ini तक पहुंच नहीं है, तो आप यह गारंटी नहीं दे सकते कि परिवर्तनों का कोई प्रभाव होगा।

मुझे संदेह है कि आपको अपने सत्र समय का विस्तार करने की आवश्यकता है।
इस समय इसमें बहुत समझदार समय है और इसे बढ़ाने के लिए कोई कारण नहीं हैं।


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

जहां तक ​​मैं देख सकता हूं, यह न केवल बंद था, बल्कि हटा दिया गया था। इन लोगों का कोई सम्मान नहीं है। हां, आपकी समस्या का एक सामान्य समाधान है जिसके बारे में मैं बात कर रहा था। मैं आपको ईमेल से लिखूंगा। संक्षेप में, इन प्रचलित / अगले मूल्यों को प्राप्त करने के लिए 2 अतिरिक्त प्रश्नों को चलाने के बारे में था। SELECT id FROM gallery WHERE SortOrder > $currentsortorder LIMIT 1
आपका कॉमन सेंस

0

आप अपने PHP कोड का उपयोग करके php.ini में मूल्यों को ओवरराइड कर सकते हैं ini_set()


4
-1: session.gc_maxlifetimeवह सेटिंग नहीं है जो जीवनकाल को नियंत्रित करती है। यदि आप सेट session.gc_divisorकरते हैं 1, तो इस तरह से काम किया जा सकता है , लेकिन यह सिर्फ भयानक है।
जॉन

1
@ क्या मैंने एसओ पर इतने सारे जवाब देखे हैं कि वे इसके विपरीत सुझाव दे रहे हैं, ऐसा क्यों है? stackoverflow.com/questions/514155/… stackoverflow.com/questions/9904105/…
giannis christofakis

2
@yannishristofakis: gc_maxlifetimeअंतराल सेट करता है जिसके बाद सत्र डेटा कचरा संग्रहण के लिए योग्य है - यदि GC इसके बाद होता है कि बहुत समय बीत चुका है, सत्र डेटा नष्ट हो जाएगा (डिफ़ॉल्ट सेटिंग्स के साथ यह सत्र को समाप्त करने के समान है)। लेकिन GC प्रत्येक सत्र के प्रारंभ पर संभावित रूप से चालू हो जाता है, इसलिए इस बात की कोई गारंटी नहीं है कि सत्र वास्तव में समाप्त हो जाएगा - आप समय बनाम प्रॉब की वक्र प्लॉट कर सकते हैं, लेकिन यह एक ईंटवॉल की तरह नहीं दिखेगा। वह सिर्फ हिमशैल का सिरा है; देखें stackoverflow.com/questions/520237/…
जॉन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.