जाँच करें कि क्या PHP सत्र शुरू हो चुका है


461

मेरे पास एक PHP फ़ाइल है जिसे कभी-कभी एक पृष्ठ से बुलाया जाता है जिसने सत्र शुरू किया है और कभी-कभी ऐसे पृष्ठ से जिसे सत्र शुरू नहीं हुआ है। इसलिए जब मैं session_start()इस स्क्रिप्ट पर होता हूं तो मुझे कभी-कभी "सत्र पहले ही शुरू हो जाता है" के लिए त्रुटि संदेश मिलता है। उसके लिए मैंने ये पंक्तियाँ डाली हैं:

if(!isset($_COOKIE["PHPSESSID"]))
{
  session_start();
}

लेकिन इस बार मुझे यह चेतावनी संदेश मिला:

सूचना: अपरिभाषित चर: _SESSION

यदि सत्र पहले ही शुरू हो गया है, तो जांचने का एक बेहतर तरीका क्या है?

अगर मैं उपयोग करता हूं तो @session_startयह चीजों को ठीक से काम करेगा और बस चेतावनी को बंद कर देगा?



Stackoverflow का यह उत्तर भी देखें: stackoverflow.com/questions/1545357/…
contact-form.co_you_go

जवाबों:


761

PHP के संस्करणों के लिए अनुशंसित तरीका > = 5.4.0, PHP 7

if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

संदर्भ: http://www.php.net/manual/en/function.session-status.php

PHP <5.4.0 के संस्करणों के लिए

if(session_id() == '') {
    session_start();
}

1
मुझे लगता है कि PHP <5.4 के समाधान के साथ एक समस्या है। session_id का सेट है FIRST समय सत्र शुरू हो गया है, लेकिन सत्र बंद होने पर इसे हटाया नहीं जाता है। उदाहरण के लिए, यदि आपके स्निपेट से पहले, कोई कोड है, session_start();session_write_close();तो: यदि स्थिति विफल हो जाती है, लेकिन हमारे पास कोई खुला सत्र नहीं है ...
निकोलो मार्टिनी

@ निकोलो मार्टिनी जैसा कि मैं इसे समझता हूं: session_start()एक स्क्रिप्ट के शीर्ष पर एक सत्र शुरू हुआ जब स्क्रिप्ट से बाहर निकलता है, या जब session_write_closed()स्क्रिप्ट से बाहर निकलने से पहले कॉल किया जाता है। जब सत्र डेटा कुकी के लिए लिखा जाता है तो सत्र CLOSES और सत्र को किसी अन्य स्क्रिप्ट द्वारा एक्सेस करने के लिए अनलॉक किया जाता है जिसे 'session_start' भी कहा जाता है। CLOSING का मतलब यह नहीं है कि सत्र DESTROYED है, इसलिए। आप वर्तमान स्क्रिप्ट या कॉलिंग से बाहर निकलकर सत्र बंद कर सकते हैं session_write_close(), और आप कॉल करके इसे फिर से खोल सकते हैं session_start()। मेरी समझ, कम से कम।
स्टेफन

1
क्या सत्र शुरू करने का यह अभी भी एक अच्छा तरीका है? क्योंकि लिंक में इस उत्तर से संबंधित कुछ भी नहीं है
csandreas1

@ csandreas1 आप लिंक सेशन_स्टैटस के विवरण और इसके अपेक्षित रिटर्न मानों को देखेंगे। आपके प्रश्न का उत्तर है - हां!
सुंदरमों

मैंने इसे कुछ परिस्थितियों में विफल कर दिया है - मैंने सफलता के साथ ((isset ($ _ सत्र)) का उपयोग किया है
स्कॉट

161

PHP के संस्करणों के लिए PHP 5.4.0 से पहले:

if(session_id() == '') {
    // session isn't started
}

हालांकि, IMHO, आपको वास्तव में अपने सत्र प्रबंधन कोड को फिर से शुरू करने के बारे में सोचना चाहिए अगर आपको पता नहीं है कि सत्र शुरू हुआ है या नहीं ...

उस ने कहा, मेरी राय व्यक्तिपरक है, और ऐसी स्थितियां हैं (उदाहरण नीचे दिए गए टिप्पणियों में वर्णित हैं) जहां सत्र शुरू होने पर यह जानना संभव नहीं होगा।


37
जरूरी नहीं कि आपका सत्र शुरू हो, यह पता ही न चले। यदि आप आलसी-लोडिंग कर रहे हैं (केवल पहली बार सत्र शुरू करने की आवश्यकता है) तो आपके उत्तर में परीक्षा पूरी तरह से ठीक होगी।
9

1
इसके अलावा कुछ वातावरणों में अपाचे में सत्र ऑटोस्टार्टिंग सेट है
लियोनार्डकैल्सिस

यदि एक
सत्र

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

मम्म, वास्तव में अच्छे अंक। मैं मानता हूं कि मेरी टिप्पणियाँ बहुत व्यक्तिपरक हैं - मैं इसे प्रतिबिंबित करने के लिए अपने उत्तर में संशोधन करूँगा।
एलेक्स

71

PHP 5.4 ने session_status () की शुरुआत की , जो कि भरोसा करने से अधिक विश्वसनीय है session_id()

निम्नलिखित स्निपेट पर विचार करें:

session_id('test');
var_export(session_id() != ''); // true, but session is still not started!
var_export(session_status() == PHP_SESSION_ACTIVE); // false

इसलिए, यह जाँचने के लिए कि क्या सत्र शुरू किया गया है, PHP 5.4 में अनुशंसित तरीका अब है:

session_status() == PHP_SESSION_ACTIVE

3
कोड का एक स्निपेट, जो उपलब्ध होने पर सेशन_स्टैटस का उपयोग करता है और जब पुराने तरीके यहां सही नहीं लगेंगे तो BTW, हिंट हिंट :)
जिम्बो जॉनी

1
अपडेट बेंजामिन के लिए धन्यवाद। यह जानना अच्छा है कि PHP 5.4 के रूप में एक नई विधि का उपयोग किया जा सकता है।
लोगन

1
यह जाँचने का एक बेहतर तरीका है, आप हमेशा यह नहीं जानते हैं कि क्या आपके पास एक सत्र शुरू हुआ है विशेष रूप से जब उपयोगकर्ता कुकीज़ को साफ़ करता है जब वे साइट ब्राउज़ करने के बीच में होते हैं ... मैं हमेशा 2 वर्ष के लिए कोड करता हूं, आप कभी नहीं पता कि उपयोगकर्ता क्या करने जा रहे हैं ;-) अपने आप के लिए मेरे पास एक छोटी सी config.php फ़ाइल है जिसे मेरी सभी लिपियों को चर और अन्य जानकारी के लिए कहा जाता है, इसलिए उस फ़ाइल में इसे जोड़ने से हमेशा आश्वासन मिलता है कि सत्र शुरू हो गया है यह आवश्यक है
एंडी ब्रहम

35

आप यह कर सकते हैं, और यह वास्तव में आसान है।

if (!isset($_SESSION)) session_start();

आशा है ये मदद करेगा :)


6
@zloctb: मैं ऐसी किसी भी स्थिति के बारे में नहीं सोच सकता जिसमें मैं करूं $_SESSION=array();, इसलिए यह जवाब ठीक लगता है।
halfer

5
@ रेफर ने रयान का जवाब देखा। अगर session_destroy()बुलाया गया है, तब $_SESSIONभी सेट किया जा सकता है। इसके अलावा, यूनिट परीक्षणों में आप $_SESSIONसीधे सेट कर सकते हैं। लेकिन मैंने इसे उतारा, क्योंकि अधिकांश व्यावहारिक स्थितियों के लिए यह उत्तर काफी अच्छा होना चाहिए (जब तक कि PHP 5.3 को कभी और नहीं देखा जाता ...)
डैरेन कुक

22
if (version_compare(phpversion(), '5.4.0', '<')) {
     if(session_id() == '') {
        session_start();
     }
 }
 else
 {
    if (session_status() == PHP_SESSION_NONE) {
        session_start();
    }
 }

21

PHP 5.4 से पहले एक वैश्विक ध्वज को स्थापित करने के अलावा कोई और जानने का विश्वसनीय तरीका नहीं है।

विचार करें:

var_dump($_SESSION); // null
session_start();
var_dump($_SESSION); // array
session_destroy();
var_dump($_SESSION); // array, but session isn't active.

या:

session_id(); // returns empty string
session_start();
session_id(); // returns session hash
session_destroy();
session_id(); // returns empty string, ok, but then
session_id('foo'); // tell php the session id to use
session_id(); // returns 'foo', but no session is active.

तो, PHP 5.4 से पहले आपको एक वैश्विक बूलियन सेट करना चाहिए।


12

सभी php संस्करण के लिए

if ((function_exists('session_status') 
  && session_status() !== PHP_SESSION_ACTIVE) || !session_id()) {
  session_start();
}

1
इसी तरह, कोई भी कर सकता हैif ((defined('PHP_SESSION_ACTIVE') && session_status() !== PHP_SESSION_ACTIVE) || !session_id())
एंथनी हाटज़ोपोलोस

9

इसे देखो :

<?php
/**
* @return bool
*/
function is_session_started()
{
    if ( php_sapi_name() !== 'cli' ) {
        if ( version_compare(phpversion(), '5.4.0', '>=') ) {
            return session_status() === PHP_SESSION_ACTIVE ? TRUE : FALSE;
        } else {
            return session_id() === '' ? FALSE : TRUE;
        }
    }
    return FALSE;
}

// Example
if ( is_session_started() === FALSE ) session_start();
?>

स्रोत http://php.net




5

यह सभी PHP संस्करणों के लिए काम करना चाहिए। यह PHP संस्करण को निर्धारित करता है, फिर यह देखने के लिए जाँच करता है कि सत्र PHP संस्करण पर आधारित है या नहीं। फिर अगर सत्र शुरू नहीं होता है तो यह शुरू हो जाता है।

function start_session() {
  if(version_compare(phpversion(), "5.4.0") != -1){
    if (session_status() == PHP_SESSION_NONE) {
      session_start();
    }
  } else {
    if(session_id() == '') {
      session_start();
    }
  }
}

4

केवल एक चीज जो आपको करने की आवश्यकता है:

<?php
if(!isset($_SESSION))
{
session_start();
}
?>

यह वही है जिसका मैंने वर्षों में उपयोग किया है। किसी को भी इस एक का उपयोग करने की सलाह नहीं? बेशक यह अच्छा एक जांच का उपयोग करने के अगर सत्र कभी कभी शुरू कर दिया है - कुछ वातावरण में अपाचे है सत्र autostarting की स्थापना की, आलसी लोडिंग या बस है कि एक कभी कभी बस एक तेजी से हैक करने की जरूरत है (केवल सत्र जब वह पहली बार आवश्यक है शुरू)
कश्मीर । किलियन लिंडबर्ग

SAME RESPONSE ABOVE (@miyuru)

2

इस तरह के समाधान की दक्षता के बारे में निश्चित नहीं है, लेकिन यह कार्यशील परियोजना से है। इसका उपयोग डिफ़ॉल्ट भाषा को परिभाषित करने की आवश्यकता होने पर भी किया जाता है

   /**
    * Start session
    * Fall back to ukrainian language
    */
   function valid_session() {
    if(session_id()=='') {
        session_start();
        $_SESSION['lang']='uk';
        $_SESSION['lang_id']=3;
    }
    return true;
  }

2

@ फ़ंक्शन कॉल से पहले फ़ंक्शन कॉल के दौरान रिपोर्ट की जा सकने वाली किसी भी त्रुटि को दबा देती है।

@पहले जोड़नाsession_start पीएचपी बताता त्रुटि संदेश मुद्रण से बचने के लिए।

उदाहरण के लिए:

उपयोग करने के session_start()बाद आप पहले से ही ब्राउज़र में किसी चीज़ को प्रिंट करने में त्रुटि करते हैं, इसलिए PHP कुछ ऐसा प्रदर्शित करेगा जैसे "हेडर नहीं भेजा जा सकता: पर शुरू किया गया (पंक्ति 12),"@session_start() इस मामले में अभी भी विफल रहेगा, लेकिन त्रुटि संदेश पर मुद्रित नहीं किया गया है स्क्रीन।

फ़ाइलों को शामिल करने या नए पृष्ठ पर पुनर्निर्देशित करने से पहले उपयोग करें exit() फ़ंक्शन का , अन्यथा यह एक त्रुटि देगा।

इस कोड का उपयोग सभी मामलों में किया जा सकता है:


    <?php 
        if (session_status() !== PHP_SESSION_ACTIVE || session_id() === ""){
            session_start(); 
        }
    ?>

1

PHP 5.3 पर यह मेरे लिए काम करता है:

if(!strlen(session_id())){
    session_name('someSpecialName');
    session_start();
} 

तो आपके पास है। यदि आप सत्र को शुरू करने वाले वक्तव्य पर नहीं डालते हैं तो मैं किसी भी तरह से शुरू नहीं करूंगा।


1

प्रतिक्रिया @Meliza Ramos रिस्पांस (पहली प्रतिक्रिया देखें) और http://php.net/manual/en/function.phpversion.ph पर आधारित ,

कार्रवाई:

  • अगर मौजूद नहीं है तो PHP_VERSION_ID को परिभाषित करें
  • PHP_VERSION_ID के आधार पर संस्करण की जांच करने के लिए फ़ंक्शन को परिभाषित करें
  • ओपनसेशन () सुरक्षित करने के लिए फ़ंक्शन को परिभाषित करें

केवल OpenSession () का उपयोग करें

    // PHP_VERSION_ID is available as of PHP 5.2.7, if our
    // version is lower than that, then emulate it
    if (!defined('PHP_VERSION_ID')) {
        $version = explode('.', PHP_VERSION);

        define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2]));


        // PHP_VERSION_ID is defined as a number, where the higher the number
        // is, the newer a PHP version is used. It's defined as used in the above
        // expression:
        //
        // $version_id = $major_version * 10000 + $minor_version * 100 + $release_version;
        //
        // Now with PHP_VERSION_ID we can check for features this PHP version
        // may have, this doesn't require to use version_compare() everytime
        // you check if the current PHP version may not support a feature.
        //
        // For example, we may here define the PHP_VERSION_* constants thats
        // not available in versions prior to 5.2.7

        if (PHP_VERSION_ID < 50207) {
            define('PHP_MAJOR_VERSION',   $version[0]);
            define('PHP_MINOR_VERSION',   $version[1]);
            define('PHP_RELEASE_VERSION', $version[2]);

            // and so on, ...
        }
    }

    function phpVersionAtLeast($strVersion = '0.0.0')
    {
        $version = explode('.', $strVersion);

        $questionVer = $version[0] * 10000 + $version[1] * 100 + $version[2];

        if(PHP_VERSION_ID >= $questionVer)
            return true;
        else
            return false;

    }

    function openSession()
    {
        if(phpVersionAtLeast('5.4.0'))
        {
            if(session_status()==PHP_SESSION_NONE)
                session_start();
        }
        else // under 5.4.0
        {
            if(session_id() == '')
                session_start();
        }
    }

1
if (version_compare(PHP_VERSION, "5.4.0") >= 0) {
    $sess = session_status();
    if ($sess == PHP_SESSION_NONE) {
        session_start();
    }
} else {
    if (!$_SESSION) {
        session_start();
    }
}

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


1

क्या यह कोड स्निपेट आपके लिए काम कर रहा है?

if (!count($_SESSION)>0) {
    session_start();
}

0

आपको अपने कोड को पुनर्गठित करना चाहिए ताकि आप session_start()प्रति पृष्ठ निष्पादन के लिए एक बार कॉल करें ।


4
कुछ स्थितियों में प्रति पृष्ठ निष्पादन के ठीक बाद इसे कॉल करना संभव नहीं है।
टिमो हुओवेनन

यदि आप इसे फिर से बनाने के लिए सत्र को मार रहे हैं, तो सुनिश्चित करें, लेकिन यह एक विशेष मामला है। सामान्य तौर पर, एप्लिकेशन में एक बार शुरू होने पर कोड होता है, जो सत्र_स्टार्ट () चला जाता है।
सैमटी

1
उदाहरण के लिए, एक एप्लिकेशन एक फ़ाइल पर सत्रों को संग्रहीत करता है, और डेटा के 2 समवर्ती धीमे अनुरोधों को लोड करने की आवश्यकता होती है, इनमें से किसी भी अनुरोध को सत्रों की आवश्यकता नहीं है, लेकिन एक दूसरे को ब्लॉक करेगा क्योंकि सत्र_स्टार्ट सत्र फ़ाइल को लॉक करता है।
टिमो हुओवेनन

बिल्कुल सही। @YuriKolovsky सही है। एलेक्स का सवाल प्रासंगिक है क्योंकि ये मामले हो सकते हैं, और वे असामान्य नहीं हैं।
पाउलो कोघी - मोनिका

14
-1, ज्यादातर वेबसाइट्स सीएमएस संचालित होती हैं और उनमें थीम और प्लगइन्स जैसी चीजें होती हैं, जो अक्सर विभिन्न पार्टियों द्वारा लिखी जाती हैं, यह कभी नहीं जानते कि एक-दूसरे के कोड ने सत्र शुरू किए हैं या नहीं। निहितार्थ यह है कि यह एक कोड संगठन समस्या केवल एक झूठी है।
जिम्बो जॉनी


0

PHP_VERSION_ID PHP 5.2.7 के रूप में उपलब्ध है, इसलिए इसे पहले जांचें और यदि आवश्यक हो, तो इसे बनाएं। session_statusPHP 5.4 के रूप में उपलब्ध है, इसलिए हमें यह भी जांचना होगा:

if (!defined('PHP_VERSION_ID')) {
    $version = explode('.', PHP_VERSION);
    define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2]));
}else{
    $version = PHP_VERSION_ID;
}
if($version < 50400){
    if(session_id() == '') {
        session_start();
    }
}else{
    if (session_status() !== PHP_SESSION_ACTIVE) {
        session_start();
    }
}

0

मेरे अभ्यास के आधार पर, $_SESSION[]कॉल करने से पहले आपको कॉल करना होगाsession_start स्क्रिप्ट का उपयोग करने के लिए आपको हर बार । मैनुअल के लिए नीचे दिए गए लिंक को देखें।

http://php.net/manual/en/function.session-start.php

मेरे लिए कम से कम session_startएक नाम के रूप में भ्रमित है। A session_loadअधिक स्पष्ट हो सकता है।


0

मैं स्थिति की दोहरी जांच के साथ समाप्त हुआ। php 5.4+

if(session_status() !== PHP_SESSION_ACTIVE){session_start();};
if(session_status() !== PHP_SESSION_ACTIVE){die('session start failed');};


0

यह वह है जो मैं यह निर्धारित करने के लिए उपयोग करता हूं कि क्या एक सत्र शुरू हो गया है। निम्नानुसार रिक्त और प्रारंभ का उपयोग करके:

if (empty($_SESSION)  && !isset($_SESSION))  {
    session_start();
}

-3

इसके session_start();साथ बदलें :

if (!isset($a)) {
    a = False;
    if ($a == TRUE) {
        session_start();
        $a = TRUE;
    }
}

इसमें कोड त्रुटियां हैं और यह केवल तभी काम करेगा, यदि एक ही फ़ाइल को कई बार शामिल किया जाएगा, लेकिन यदि एक बंद के भीतर नहीं।
बनानाएपिड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.