2010-09-24 19 views
40

प्रति अनुरोध, कुछ अलग-अलग तरीके हैं जिन्हें आप बता सकते हैं कि सत्र शुरू हो गया है या नहीं, जैसे:यह बताएं कि कोई सत्र सक्रिय है या नहीं?

$isSessionActive = (session_id() != ""); 

या:

$isSessionActive = defined('SID'); 

हालांकि, यदि आप प्रारंभ करते हैं तो ये दोनों विफल हो जाते हैं एक सत्र, फिर इसे बंद करो; session_id() पूर्व सत्र की आईडी वापस करेगा, जबकि SID परिभाषित किया जाएगा। इसी प्रकार, इस बिंदु पर session_start() को कॉल करने से आपके पास पहले से सत्र सक्रिय होने पर E_NOTICE उत्पन्न होगा। आउटपुट बफरिंग, शट-अप ऑपरेटर (@session_start()), या कुछ और हैकी के समान समान रूप से उपयोग किए बिना, कोई सत्र वर्तमान में सक्रिय है या नहीं, यह जांचने का कोई सौहार्दपूर्ण तरीका है?

संपादित करें: मैंने PHP में इस कार्यक्षमता को शामिल करने का प्रयास करने के लिए एक पैच लिखा है: http://bugs.php.net/bug.php?id=52982

EDIT 8/29/2011: इसे ठीक करने के लिए PHP 5.4 में नया फ़ंक्शन जोड़ा गया: "Expose session status via new function, session_status"

// as of 8/29/2011 
$isSessionActive = (session_status() == PHP_SESSION_ACTIVE); 

संपादित करें 12/5/11: PHP मैनुअल पर session_status()

+0

यह शायद हैकी: ['session_is_active()'] (http://stackoverflow.com/questions/3788369/how-to-tell-if-a- सत्र-is-active/7656468#7656468), लेकिन कम से कम कुछ मुझे मिला। वैसे भी बग रिपोर्ट के लिए धन्यवाद, इसे 5.4 में हल करने के लिए अच्छा लगा। – hakre

+0

अभी भी एक प्रासंगिक प्रश्न w/5.4 अतिरिक्त है, क्योंकि मैंने अभी तक 5.3 बॉक्स पर धक्का दिया है और 'session_status()' गायब पाया है! – quickshiftin

+0

यह निश्चित रूप से विषम है, क्योंकि यह वास्तव में मेरे 5.4 निर्माण पर मौजूद है। क्या आप कह रहे हैं कि आप 5.3 या 5.4 का उपयोग कर रहे हैं? क्या यह एक कस्टम या प्रीबिल्ट PHP बाइनरी था? 'Phpinfo()' में, क्या आपके पास "सत्र" अनुभाग है? कार्रवाई में: http://codepad.viper-7.com/PiZmcw – ken

उत्तर

22

देखें मूल प्रश्न को संपादित करता है; मूल रूप से, PHP 5.4 और ऊपर अब इस समस्या को हल करने के लिए session_status() नामक एक फ़ंक्शन है!

"Expose session status via new function, session_status" (SVN Revision 315745)

आप एक पूर्व पीएचपी 5.4 संस्करण में इस कार्यक्षमता की जरूरत है, hakre's answer देखते हैं।

3

निम्न कोड केवल मेरे लिए एक session_id(), नहीं उदासीनता दो

session_start(); 
echo session_id(); 
session_destroy(); 
echo session_id(); 

आप इस के साथ कठिनाइयों हो रही है तो अभी भी आप एक चर की जाँच करने के बनाने की कोशिश कर सकते हैं, तो आपको नष्ट कर नष्ट कि अधिवेशन।

session_start(); 
$_SESSION['intialized'] = 'This will not print'; 
$_SESSION = array(); // Unset all variables 
session_destroy(); 
echo $_SESSION['initialized']; // No output 
+3

लेकिन यदि आप सत्र_write_close() का उपयोग करते हैं, तो सत्र बंद हो गया है, लेकिन $ _SESSION डेटा अभी भी है, जो मुझे लगता है कि ओपी का क्या हो रहा है ... कैसे क्या आप जांचते हैं कि सत्र फ़ाइल स्वयं अभी भी उपयोग में है या नहीं? –

+0

हाँ, आपने मूल रूप से उसी समाधान को पोस्ट किया जो मैंने किया था, इसे बंद करने से पहले एक चर सेट करना (किसी भी तरह से) और उस चर को जांचना ... – Robert

+0

क्या मार्क बी ने कहा। – ken

0

केन, अगर सत्र नष्ट हो जाता है, $ _SESSION सरणी उपलब्ध नहीं होना चाहिए ... या बहुत कम से कम, अपने मूल्यों को सेट किए बिना किया जाना चाहिए। तो, सिद्धांत रूप में (अवांछित) आप किसी मूल्य के लिए सरणी को जांचने में सक्षम होना चाहिए ताकि यह पता चल सके कि कुछ भी वर्तमान में सेट है या नहीं।

+1

'session_destroy() 'और न ही' session_write_close() 'अनसेट' $ _SESSION'। – hakre

15

मैं भर के विभिन्न सत्र निर्माण/समापन/नष्ट कार्यों एक जोड़े आवरण कार्यों जोड़कर इस के आसपास काम किया। असल में:

function open_session() { 
    session_start(); 
    $_SESSION['is_open'] = TRUE; 
} 

function close_session() { 
    session_write_close(); 
    $_SESSION['is_open'] = FALSE; 
} 

function destroy_session() { 
    session_destroy(); 
    $_SESSION['is_open'] = FALSE; 
} 

function session_is_open() { 
    return($_SESSION['is_open']); 
} 

हैकिश, लेकिन मुझे जो चाहिए वह पूरा हुआ।

+0

ठीक है, यह भी समाधान है जिसे मैंने चुना है ...विकल्प शायद एक सत्र लिखने वाले हैंडलर को कार्यान्वित कर रहा है जो एक आंतरिक ध्वज को संशोधित करता है जिसे आप जांच सकते हैं, लेकिन इससे अपने उद्देश्य को हराया जाएगा क्योंकि इसे शुरुआत में परिभाषित करना होगा। Session_close फ़ंक्शन में – Archimedix

+0

एक भटक घुंघराले ब्रैकेट है जिसे अर्धविराम होना आवश्यक है। तो मुझे संपादित करने की अनुमति नहीं दी जाएगी क्योंकि पर्याप्त पात्रों को संपादन की आवश्यकता नहीं है। :/ – ShadeTreeDeveloper

10

मैं भी इस में चल रहा हूँ, और $_SESSION में एक सेटिंग मेरे लिए एक विकल्प नहीं है। पीएचपी 5.3.8 के लिए: किसी भी सत्र अनुरोध के साथ शुरू कर दिया गया

  1. हैं, तो define('SID')FALSE वापस आ जाएगी, साथ ही $_SESSION सेट नहीं की जाती।
  2. यह स्वतंत्र है कि session_id() का उपयोग सत्र आईडी सेट करने के लिए किया गया है या नहीं।
  3. पहले session_start() के बाद, SID परिभाषित किया गया है और $_SESSION एक खाली सरणी पर सेट है।
  4. session_destroy()session_id() को अनसेट करता है, तो यह एक खाली स्ट्रिंग है। SID परिभाषित रहेगा (और इसके पिछले मान पर सेट करें जो एक खाली स्ट्रिंग हो सकता है)। $_SESSION अपरिवर्तित छोड़ दिया गया है। अगली बार session_start को रीसेट/पॉप्युलेट किया जाएगा।
इन राज्यों के साथ

, विशेष रूप से के रूप में session_id() के बीच अगले सत्र के लिए आईडी सेट करने के लिए बुलाया जा सकता है, इसे सुरक्षित रूप से SID, $_SESSION और session_id() साथ सत्र स्थिति निर्धारित करने के संभव नहीं है।

session_start() (जैसे @ के साथ) के साथ "करने का प्रयास" वास्तव में मददगार नहीं हो सकता है, इस सत्र को स्थिति बदल जाएगा और $_SESSION की सामग्रियों को परिवर्तित (और कुकी सेट हेडर को जोड़े यदि कुकी अनुरोध का हिस्सा नहीं था)। यह मेरे मामले में फिट नहीं था।

जब मैं परीक्षण चला रहा था, तो मैं व्यवहार में आया, कि सत्र सक्रिय होने पर आप session.serialize_handler की आईएनआई सेटिंग बदलने की कोशिश नहीं कर सकते हैं, भले ही आप इसे एक ही मान पर सेट न करें। session.use_trans_sidDocs के लिए भी यही सच है जो अधिक हल्का है। यह मैं निम्नलिखित समारोह के लिए नेतृत्व:

/** 
* @return bool 
*/ 
function session_is_active() 
{ 
    $setting = 'session.use_trans_sid'; 
    $current = ini_get($setting); 
    if (FALSE === $current) 
    { 
     throw new UnexpectedValueException(sprintf('Setting %s does not exists.', $setting)); 
    } 
    $result = @ini_set($setting, $current); 
    return $result !== $current; 
} 

जहां तक ​​मैं देख सकता हूँ, त्रुटि सक्रिय सत्र स्थिति केवल (नहीं विकलांग) के लिए जाँच कर रहा है, तो यह एक झूठी सकारात्मक वापस नहीं जाना चाहिए जब सत्र अक्षम हैं।

इस समारोह पीएचपी 5.2 के साथ संगत पाने के लिए, यह छोटे-से संशोधन की जरूरत है:

/** 
* @return bool 
*/ 
function session_is_active() 
{ 
    $setting = 'session.use_trans_sid'; 
    $current = ini_get($setting); 
    if (FALSE === $current) 
    { 
     throw new UnexpectedValueException(sprintf('Setting %s does not exists.', $setting)); 
    } 
    $testate = "mix$current$current"; 
    $old = @ini_set($setting, $testate); 
    $peek = @ini_set($setting, $current); 
    $result = $peek === $current || $peek === FALSE; 
    return $result; 
} 

कुछ sandbox

if(!function_exists('session_status')){ 
    function session_active(){ 
     return defined('SID'); 
    } 
}else{ 
    function session_active(){ 
     return (session_status() == PHP_SESSION_ACTIVE); 
    }   
} 
+1

हालांकि यह अभी भी कुछ हैकी है, मैं आपकी तकनीक से प्रभावित हूं। यह मेरी सोच थी कि समस्या के कुछ गुण थे जो खुद को अनुमान लगाने के लिए उधार देंगे (जैसे कि आप यहां क्या कर रहे हैं), मैं उन्हें ढूंढने में असमर्थ था। बहुत अच्छा! – ken

+0

इसके अलावा, आपकी साइट सैंडबॉक्स है? ओपोड विश्लेषण मीठा है। – ken

+0

नहीं, यह मेरी साइट नहीं है, लेकिन मुझे यह भी पसंद है। :) अभी मैं उस हैक के साथ अनिश्चित हूं अगर यह PHP 5.1 के लिए काम करता है (मुझे इसकी आवश्यकता हो सकती है)। – hakre

1

यहाँ प्रतिस्थापन में एक अच्छा ड्रॉप कि सामान को तोड़ने नहीं होगा जब आप 5.4 को स्थानांतरित है कुकी मौजूद है और समाप्त नहीं हुई है 2- अंतर्निहित सत्र संग्रहण तंत्र (फ़ाइल सिस्टम या डेटाबेस) में कुकी से मेल खाने वाला रिकॉर्ड है।

+0

जैसा कि मैंने अपने मूल प्रश्न में कहा है, यह एक अपर्याप्त समाधान है; यदि आप 'session_start()' को कॉल करते हैं और फिर 'session_write_close() 'पर कॉल करते हैं, तो' परिभाषित (" एसआईडी ") === सत्य 'हालांकि सत्र खुला नहीं है। ऐसी तकनीक केवल यह निर्धारित कर सकती है कि अनुरोध चक्र के दौरान एक सत्र शुरू किया गया है - और यह नहीं कि कोई वर्तमान में खुला है या नहीं। यह कुछ उपयोग-मामलों के लिए काम कर सकता है, लेकिन यह 'session_status()' के लिए प्रतिस्थापन नहीं है। – ken

0

वहाँ कई स्थानों आप सत्र सत्यापित करने के लिए जांच करने की जरूरत है सक्रिय हैं:

1-

+0

मुझे लगता है कि आपने लक्ष्य/इरादे को गलत समझा। – ken

+0

शायद हाँ। मैं उन सत्रों से निपटने के लिए अधिक उपयोग करता हूं जिनमें कस्टम कार्यक्षमता है। सत्र को कक्षा में समाहित करना अच्छा होगा ताकि जब विनाशक को बुलाया जा सके, या session_write_closed सदस्य फ़ंक्शन को कॉल किया जाता है, तो आप उस वर्ग में एक बूलियन ध्वज को सक्रिय या नहीं दिखाते हैं। – beiller

+0

यह 'नोटिस से बचने के लिए है: एक सत्र पहले से ही शुरू कर दिया गया था - session_start() 'को अनदेखा कर रहा है। इस बग में उपयोग-मामले पर अधिक जानकारी है: http://bugs.php.net/bug.php?id=52982 – ken

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