2008-10-29 6 views
6

जब उपयोगकर्ता का सत्र टाइमआउट होता है तो मैं उपयोगकर्ताओं को लॉग आउट करने का प्रयास कर रहा हूं। उपयोगकर्ताओं को लॉग आउट करना - मेरे मामले में - डेटाबेस में उपयोगकर्ता की "ऑनलाइन" स्थिति को संशोधित करने की आवश्यकता है।
मैं सोच रहा था कि मैं कुछ ऐसा करने के लिए पर्यवेक्षक पैटर्न का उपयोग करने में सक्षम हो सकता हूं जो उपयोगकर्ता सत्र की स्थिति की निगरानी करेगा और सत्र समाप्त होने पर कॉलबैक ट्रिगर करेगा - जो उपयोगकर्ता के नाम को सुरक्षित रखेगा ताकि हम डीबी अपडेट कर सकें। मुझे बिल्कुल यकीन नहीं है कि सत्र की ओर कहां से शुरू किया जाए। क्या मैं सत्र के टाइमआउट में कॉलबैक बांध सकता हूं?php पर्यवेक्षक पैटर्न उपयोगकर्ता को लॉग आउट करने के लिए

क्या ये चीजें किसी भी उपलब्ध नाशपाती या ज़ेंड सत्र पैकेज में बनाई गई हैं? मैं ऐसा करने के लिए जो कुछ भी करना चाहता हूं उसका उपयोग करूंगा!



अद्यतन @ 16:33:
क्या होगा अगर आप एक प्रणाली है जहाँ उपयोगकर्ताओं को एक दूसरे के साथ बातचीत कर सकते हैं (लेकिन वे केवल ऑनलाइन उपयोगकर्ताओं के साथ बातचीत कर सकते हैं) है? उपयोगकर्ता को यह जानने की जरूरत है कि वर्तमान में कौन से अन्य उपयोगकर्ता ऑनलाइन हैं।

यदि हम बस यह देखने के लिए जांचते हैं कि प्रत्येक पृष्ठ पर सत्र अभी भी जीवित है या नहीं, तो टाइमआउट के बाद, उपयोगकर्ता को एक गैर-लॉग इन पेज पर भेजा जाता है, लेकिन वे अभी भी सिस्टम में ऑनलाइन सूचीबद्ध हैं।

यह विधि ठीक होगी, सिवाय इसके कि जब हम सत्र का समय निकालते हैं, तो हम उस उपयोगकर्ता के बारे में जानकारी खो देते हैं जिसका उपयोग उन्हें लॉग आउट करने के लिए किया जा सकता है।



अद्यतन @ 16: 56:
सही। धन्यवाद। मैं सहमत हूं ... बदसूरत की तरह। मेरे पास सर्वर की कुछ धीमी मतदान हो रही है, इसलिए उस विधि को लागू करना काफी आसान होगा। यह एक सत्र हैंडलिंग पैकेज के लिए ऐसी उपयोगी सुविधा की तरह लगता है। ज़ेंड और पीएआर दोनों में सत्र पैकेज हैं।

उत्तर

1

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

लेकिन व्यावहारिक उद्देश्यों के लिए जो आमतौर पर कोई फर्क नहीं पड़ता।

0

बदसूरत लेकिन शायद व्यावहारिक सुझाव:

पृष्ठों के लिए एक अतुल्यकालिक रखें जिंदा निवेदक, कि उन्होंने अपनी पिछली सक्रिय टाइमस्टैम्प अपडेट हो जाता है जोड़ें। उसके बाद आप एक क्रॉन नौकरी कर सकते हैं जो उपयोगकर्ताओं को ऑफ़लाइन के रूप में चिह्नित करता है यदि उनके पास 20 सेकंड से अधिक पुराना सक्रिय टाइमस्टैम्प है। हर मिनट चलाने के लिए उस क्रॉन नौकरी को स्थापित करना चाल करेगा। मुझे यकीन नहीं है कि किसी उपयोगकर्ता के सत्र के समय समाप्त होने पर या अपने ब्राउज़र को बंद करने पर कुछ ऐसा करने का तरीका होता है।

2

पहले सबसे सरल मामला लें। मान लीजिए कि आपके सिस्टम पर 1 उपयोगकर्ता है, और आप अपने सत्र को टाइमआउट करना चाहते हैं, और आप उनकी स्थिति की सटीक रिपोर्टिंग चाहते हैं। उपयोगकर्ता 12 मिनट में किसी पृष्ठ पर नहीं गया है, और आपका सत्र टाइमआउट 10 मिनट पर सेट हो गया है। दो चीजों में से एक होगा। या तो वे थोड़ी देर में फिर से देखेंगे, या वे नहीं करेंगे। यदि वे फिर से नहीं जाते हैं, तो सिस्टम कभी भी टाइमआउट स्थिति अपडेट करने के लिए कोड कैसे चलाएगा? एकमात्र तरीका * एक अलग प्रक्रिया है जो वर्तमान में "सत्र में" स्थिति वाले सभी उपयोगकर्ताओं के लिए एक स्टेटस अपडेट फ़ंक्शन शुरू करती है।

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

"*" अन्य तरीके हैं, लेकिन एक साधारण वेब एप्लिकेशन के प्रयोजनों के लिए, यह वास्तव में आवश्यक नहीं है। यदि आपके पास एक साधारण वेब ऐप से कुछ अधिक जटिल है, तो विशिष्ट आवश्यकता को दर्शाने के लिए अपना प्रश्न अपडेट करें।

+0

क्रॉन के बजाए, पृष्ठ के तर्क के ऊपर एक साधारण उपयोगकर्ता जांच करें (कुकी के लिए देखो, उपयोगकर्ता के डीबी रिकॉर्ड आदि पर 'last_visited' कॉलम देखें)। इसलिए यदि उपयोगकर्ता फिर से सक्रिय होने का निर्णय लेता है, तो आप उपयोगकर्ता की जानकारी और गतिविधि को सत्यापित कर सकते हैं, और फिर भी रीडायरेक्ट करने में सक्षम हो सकते हैं क्योंकि शीर्षलेख अभी तक नहीं भेजे गए थे। –

0

मेरा पहला विचार यह है कि आप कस्टम सत्र हैंडलर बना सकते हैं जो एक सक्रिय सत्र के रूप में लॉग इन होने का अर्थ है।

बनाने के लिए एक कस्टम सत्र हैंडलर http://www.daniweb.com/code/snippet43.html देख सकते हैं और जब भी कोई उपयोगकर्ता एक पृष्ठ हिट पीएचपी डॉक http://ca.php.net/manual/en/function.session-set-save-handler.php

2

पढ़ा है, डेटाबेस में उस समय निशान पर कुछ उदाहरणों के लिए, फोन इस स्तंभ LastAccessed। जब उपयोगकर्ता आपकी साइट के लॉगआउट हिस्से पर क्लिक करता है, तो आप इस मान को शून्य पर सेट कर सकते हैं।

SELECT * FROM Users WHERE LoggedIn=1 AND LastAccess > DATEADD(Minute,-20.GETDATE()) 

कौन है जो अभी भी एक सक्रिय सत्र उन वापसी होगी: जब आपकी क्वेरी लिख उपयोगकर्ताओं को, जो वर्तमान में लॉग इन कर रहे हैं की एक सूची प्राप्त करने के लिए, निम्न कार्य करें। एसक्यूएल क्षमा करें जो शायद MySQL/PHP के साथ काम नहीं करता है, लेकिन यह आपको एक सामान्य विचार देना चाहिए।

0

मैं इस एक बड़े सवाल हो सकता है पता है, लेकिन आपके सवाल का "सर्वश्रेष्ठ" जवाब यहाँ पाया जाता है: php.ini फ़ाइल एक सेटिंग बुलाया sesison.save_path शामिल हैं: http://www.codeguru.com/forum/archive/index.php/t-372050.html

यहाँ यह क्या कहते है , यह निर्धारित करता है कि PHP कहां रखता है जिसमें सत्र डेटा होता है। एक बार सत्र बनने के बाद, इसे अगले कचरा संग्रह के दौरान PHP द्वारा हटा दिया जाएगा। इसलिए, उस सत्र के लिए एक फ़िल की उपस्थिति के लिए एक परीक्षण यह निर्धारित करने के लिए पर्याप्त होना चाहिए कि सत्र अभी भी मान्य है या नहीं।

$session_id = 'session_id'; 
$save_path = ini_get('session.save_path'); 

if (! $save_path) { 
$save_path = '.'; // if this vlaue is blank, it defaults to the current directory 
} 

if (! file_exists($save_path . '/sess_' $session_id)) { 
unlink($session_id); // or whatever your file is called 
}