2008-10-04 11 views
7

मेरे पास एक एपीआई है जो अनुरोधों के बीच कुछ राज्य जानकारी पर निर्भर है। कोड के एक आसान पहले संस्करण के रूप में, मैं बस कुछ और उन्नत (एपीसी, memcache, डीबी) की बजाय राज्य की जानकारी स्टोर करने के लिए PHP सत्र का उपयोग कर रहा हूँ। एक वेब ब्राउज़र में अपने प्रारंभिक परीक्षण के दौरान, सब कुछ पूरी तरह से काम किया। हालांकि, ऐसा लगता है कि जब ग्राहक कर्ल या wget जैसे गैर-ब्राउज़र विधियों से कनेक्ट करने का प्रयास करते हैं, तो राज्य की जानकारी संरक्षित नहीं की जा रही है।PHP में एक सत्र बनाया जाएगा यदि कोई ब्राउज़र उपयोग नहीं किया जाता है

क्या कोई PHP सत्र केवल तभी बनाया जाएगा जब कोई ब्राउज़र पृष्ठ का अनुरोध कर रहा हो? मैं session_start() के साथ सत्र को स्पष्ट रूप से शुरू कर रहा हूं और सत्र_नाम() के साथ इसे पहले नामकरण कर रहा हूं।

एक जोड़ा गया नोट। मैंने सीखा कि मेरी बड़ी समस्याओं में से एक यह था कि मैं session_id ($ id) के माध्यम से सत्र आईडी सेट करने के बजाय सत्र का नाम दे रहा था; Session_name() का उपयोग करने का मेरा इरादा उसी सत्र को पुनर्प्राप्त करना था जो पहले बनाया गया था, और ऐसा करने का सही तरीका session_id को session_name नहीं सेट करना है।

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

उत्तर

20

सत्र कुकीज़

जो HTTP याद रखें, राज्यविहीन है। जब आप session_start(), घोषित करते हैं तो आपका ब्राउज़र आमतौर पर एक कुकी ("PHP सत्र आईडी") सेट कर रहा है, और फिर प्रत्येक अनुरोध के साथ कुकी मान भेजकर स्वयं को पहचान रहा है। जब किसी स्क्रिप्ट को सत्र मान के साथ अनुरोध का उपयोग करके बुलाया जाता है, तो session_start() फ़ंक्शन सत्र को देखने का प्रयास करेगा। अपने आप को यह साबित करने के लिए, ध्यान दें कि जब आप अपनी कुकी साफ़ करते हैं तो सत्र मर जाते हैं .. जैसे ही कुकी ब्राउज़र छोड़ती है, कई लोग मर जाएंगे, अगर कुकी "सत्र" कुकी (एक अस्थायी) है। आपने उल्लेख किया है कि आप सत्र का नाम दे रहे हैं .. अपनी ब्राउज़र कुकीज़ में एक नज़र डालें और देखें कि क्या आप एक ही नाम के साथ एक कुकी पा सकते हैं।

यह सब कहना है कि कुकीज़ आपके सत्रों में सक्रिय भूमिका निभा रही हैं, इसलिए यदि क्लाइंट कुकीज़ का समर्थन नहीं करता है, तो आप वर्तमान में ऐसा करने के तरीके को सत्र नहीं कर सकते हैं। कम से कम उन वैकल्पिक ग्राहकों के लिए नहीं। सर्वर पर एक सत्र बनाया जाएगा; प्रश्न यह है कि ग्राहक भाग ले रहा है या नहीं।

यदि कुकीज़ आपके क्लाइंट के लिए कोई विकल्प नहीं है, तो आपको सर्वर पर सत्र आईडी पास करने के लिए एक और तरीका ढूंढना होगा। यह क्वेरी स्ट्रिंग में किया जा सकता है, उदाहरण के लिए, हालांकि इसे इस तरह से सत्र आईडी भेजने के लिए थोड़ा कम माना जाता है।

mysite.com?PHPSESSID=10alksdjfq9e 

यह कैसे विशेष रूप से PHP के आपके संस्करण के साथ भिन्न हो सकता है, लेकिन यह मूल रूप से केवल एक कॉन्फ़िगरेशन है। यदि उचित रनटाइम विकल्प सेट किए गए हैं, तो PHP पृष्ठ पर लिंक पर क्वेरी पैरामीटर के रूप में सत्र आईडी को पारदर्शी रूप से जोड़ देगा (केवल उसी स्रोत के लिए)। आप इसे PHP website पर सेट करने के लिए विशिष्टताओं को पा सकते हैं।

Sidenote: साल पहले, सत्र को कार्यान्वित करने का प्रयास करते समय यह एक आम समस्या थी।कुकीज नए थे और कई लोग अपने ब्राउज़र में गुप्त सुरक्षा चिंताओं के कारण कुकी समर्थन बंद कर रहे थे।

Sidenote:@Uberfuzzy एक अच्छा point- कर्ल या wget के साथ सत्र का उपयोग करता है वास्तव में संभव है। समस्या यह है कि यह कम स्वचालित है। कोई उपयोगकर्ता शीर्षलेख मान को फ़ाइल में डंप कर सकता है और भविष्य के अनुरोधों पर मानों का उपयोग कर सकता है। कर्ल में कुछ "कुकी जागरूकता" झंडे हैं, जो आपको इसे अधिक आसानी से संभालने की अनुमति देते हैं, लेकिन आपको अभी भी इसे स्पष्ट रूप से करना होगा। फिर फिर, आप इसका उपयोग अपने लाभ के लिए कर सकते हैं। यदि आपके वैकल्पिक ग्राहक पर कर्ल उपलब्ध है, तो आप कुकी जागरूकता झंडे का उपयोग करके, कॉल को अपने आप कॉल कर सकते हैं। curl manual का संदर्भ लें।

+0

> लेकिन यदि क्लाइंट कुकीज़ का समर्थन नहीं करता है (जैसे कर्ल या wget) वास्तव में। दोनों एक कुकी फ़ाइल को संग्रहीत/लोड करने के कुछ तरीके का समर्थन करते हैं – Uberfuzzy

+0

अच्छी पकड़। धन्यवाद। – keparo

2

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

यह अप्रयुक्त सत्रों के साथ आपके सत्र संग्रहण तंत्र को मिटा सकता है।

सत्र सत्र() जैसे कॉल करने के लिए कुछ सत्र हो सकता है (उदाहरण के लिए उपयोगकर्ता लॉगिन, या कुछ और जो रोबोट करने की संभावना नहीं है), यदि आपको लगता है कि ऐसा होने की संभावना है, तो यह केवल एक बेहतर विचार हो सकता है एक समस्या हो

2

क्या कोई ब्राउज़र सत्र केवल तभी बनाया जाएगा जब कोई ब्राउज़र पृष्ठ का अनुरोध कर रहा हो?

संक्षिप्त उत्तर: हाँ। सत्र विशेष रूप से ब्राउज़र सुविधाओं का लाभ उठाकर HTTP स्टेटलेस समस्या को हल करने के लिए बनाए गए थे। एपीसी, memcached, डीबी, आदि कोई फर्क नहीं पड़ता। वे सत्र के लिए केवल भंडारण विधियां हैं, और एक ही समस्या से ग्रस्त होंगे।

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

सत्र लागू करने का सबसे आम तरीका कुकीज़ के साथ है। PHP एक कुकी में सत्र आईडी भेजता है, और ब्राउजर कुकी को सत्र आईडी के साथ भेजता है। सत्र में आपके द्वारा संग्रहीत की गई जानकारी को ढूंढने के लिए सर्वर पर यह आईडी उपयोग की जाती है। PHP में URL के अंत में एक सत्र आईडी को शामिल करने और पढ़ने की क्षमता है, लेकिन यह मानता है कि उपयोगकर्ता जेनरेट सत्र आईडी शामिल लिंक पर क्लिक करके अपनी साइट/एप्लिकेशन पर पृष्ठों पर नेविगेट करेंगे।

अपने विशिष्ट मामले में, कर्ल (और संभवतः wget) के साथ कुकीज़ का उपयोग करना संभव है। कर्ल एक वेब ब्राउज़र है, केवल एक जीयूआई के बिना। यदि यह कमांड लाइन कर्ल प्रोग्राम है जिसका उपयोग आप कर रहे हैं (सी लाइब्रेरी, PHP एक्सटेंशन इत्यादि के विपरीत) निम्नलिखित विकल्पों पर पढ़ें

-b/--cookie 
-c/--cookie-jar 
-j/--junk-session-cookies 
संबंधित मुद्दे