कभी भी समाप्त न होने के लिए कुकी सेट करें


187

को देखते हुए एक कुकी सेट पर php प्रलेखन मैं देख रहा हूँ मैं कुकी के लिए एक समाप्ति तिथि सेट कर सकते हैं। आप ब्राउज़र सत्र के अंत में या भविष्य में किसी समय में कुकी को समाप्त करने के लिए सेट कर सकते हैं लेकिन मुझे कुकी को कभी भी समाप्त नहीं करने के लिए सेट करने का कोई तरीका नहीं दिखता है। क्या यह भी संभव है और यह कैसे पूरा किया जाता है?


13
@ एसएसी: यह एक बुरी चीज क्यों है?
दिमागी जूल 20'10

1
क्योंकि कुकी विनिर्देश के अनुसार वैसे भी यह संभव नहीं है। यह कभी समाप्त नहीं होने के लिए सेट नहीं किया जा सकता है।
सरफराज जूल

2
आप उपयोग कर सकते हैं $cookie->setMaxAge(2147483647);, जो बाद में 2080 से है और 32-बिट और 64-बिट दोनों पर काम करता है, साथ में github.com/delight-im/PHP-Cookie
caw

जवाबों:


259

कुकी विनिर्देश के अनुसार सभी कुकी समाप्त हो जाती हैं , इसलिए यह एक PHP सीमा नहीं है।

दूर भविष्य की तारीख का उपयोग करें। उदाहरण के लिए, दस वर्षों में समाप्त होने वाली कुकी सेट करें:

setcookie(
  "CookieName",
  "CookieValue",
  time() + (10 * 365 * 24 * 60 * 60)
);

ध्यान दें कि यदि आप 32-बिट PHP में 2038 अतीत की तारीख निर्धारित करते हैं , तो संख्या चारों ओर लपेटेगी और आपको एक कुकी मिलेगी जो तुरंत समाप्त हो जाएगी।


8
माना! और मुझे लगता है, कि 20 वर्षों में, वेबसाइटें बहुत आगे हो जाएंगी, संभवत: कोई भी कुकीज़ का उपयोग नहीं किया जाएगा .. @brainimus: बस उल्लिखित सिस्टम का उपयोग करें जिसका उल्लेख सभी ने किया है - वर्तमान समय + दूर भविष्य में समय!
झटका

13
खबरदार कि जब 2018 के आसपास आता है, अगर हम 64-बिट PHP का उपयोग नहीं कर रहे हैं, तो यह 32-बिट पूर्णांक के आसपास लपेटेगा और शून्य के पास एक समय के रूप में क्लाइंट को भेजा जाएगा। (यह अभी PHP पर 25-वर्षीय कुकीज़ के लिए हो रहा है।)
रेकिंग

83
2018 में इन टिप्पणियों पर वापस आने के लिए मज़ेदार होगा (अभी सिर्फ 5 साल दूर है) और Y2018 अपग्रेड को लागू करने के लिए हर किसी के लिए हाथापाई के रूप में देखें फिर 2038 में 20 साल बाद फिर से। उम्मीद है कि हम सभी तब तक 64-बिट सब कुछ कर सकते हैं 4 दिसंबर 292,277,026,596 रविवार को एक और 292 बिलियन वर्षों के लिए कोई समस्या नहीं होगी। जब तक मैं मरने से पहले एक विलक्षणता तक नहीं पहुँचता, मुझे नहीं लगता कि मुझे उस बारे में चिंता करनी पड़ेगी।
शुनहुसैन

58
यदि कोई व्यक्ति 2037 के अंत में उसी कंप्यूटर का उपयोग कर रहा है जो वे अभी उपयोग कर रहे हैं ... तो यह दुखद होगा!
अबेला

22
मैं 2018 में इसे पढ़ रहा हूं, एक पल के लिए घबरा गया, फिर महसूस किया कि मैं ठीक हूं।
द इंटरलॉपर

80

अधिकतम मूल्य: 2147483647

setcookie("CookieName", "CookieValue", 2147483647);

पूर्णांक ओवरफ़्लो से बचने के लिए टाइमस्टैम्प को निम्न पर सेट किया जाना चाहिए:

2^31 - 1 = 2147483647 = 2038-01-19 04:14:07

अधिक मान सेट करने से पुराने ब्राउज़र की समस्याएँ हो सकती हैं।

कुकीज़ के बारे में RFC भी देखें :

Max-Age=value
  OPTIONAL.  The value of the Max-Age attribute is delta-seconds,
  the lifetime of the cookie in seconds, a decimal non-negative
  integer.  To handle cached cookies correctly, a client SHOULD
  calculate the age of the cookie according to the age calculation
  rules in the HTTP/1.1 specification [RFC2616].  When the age is
  greater than delta-seconds seconds, the client SHOULD discard the
  cookie.  A value of zero means the cookie SHOULD be discarded
  immediately.

और RFC 2616, 14.6 आयु :

यदि कोई कैश सबसे बड़ा धनात्मक पूर्णांक से बड़ा मान प्राप्त करता है, जिसका वह प्रतिनिधित्व कर सकता है, या यदि उसकी आयु की कोई भी गणना अधिक होती है, तो उसे 2147483648 (2 ^ 31) के मान के साथ एक आयु शीर्षलेख प्रसारित करना होगा।

http://www.faqs.org/rfcs/rfc2616.html


39

एक पूर्ण भविष्य का समय निर्धारित करें :

setcookie("CookieName", "CookieValue", 2147483647);

स्वीकार किए गए उत्तर में अनुशंसित अनुसार वर्तमान के सापेक्ष गणना करने की तुलना में निरपेक्ष समय का उपयोग करना बेहतर है।

32 बिट सिस्टम के साथ संगत अधिकतम मूल्य है:

2147483647 = 2^31 = ~year 2038

22
2 बिलियन याद रखना आसान है, लेकिन $ 20 के लिए आदर्श संख्या 2 ^ 31 - 1 = 2147483647 जनवरी 2038 के अनुरूप होगी। यह 2038 बग के पूर्णांक के बहिर्वाह से बचने के लिए अधिकतम मूल्य है जैसा कि @ जॉन ने कहा।
डेविड

13

मेरा विशेषाधिकार मुझे पहली पोस्ट पर अपनी टिप्पणी करने से रोकता है इसलिए इसे यहाँ जाना होगा।

वर्तमान तिथि से 20 साल पहले सेट करते समय 2038 यूनिक्स बग के बारे में विचार किया जाना चाहिए, जो कि ऊपर दिए गए सही उत्तर के रूप में सुझाया गया है।

आपका जनवरी 19, 2018 + (20 वर्ष) का कुकी ब्राउजर और आपके द्वारा चलाए जा रहे संस्करणों के आधार पर 2038 समस्या को अच्छी तरह से प्रभावित कर सकता है।


7

क्या आप सिर्फ कभी खत्म नहीं होने वाले लूप कह सकते हैं, कुकी वर्तमान तिथि + 1 के रूप में समाप्त हो जाती है, इसलिए यह कभी भी उस तारीख को हिट नहीं करता है जो इसे समाप्त करना है क्योंकि यह हमेशा कल है? थोड़ा ओवरकिल लेकिन सिर्फ कह रहा है।


1
दरअसल, उसके पास एक बिंदु है। 3 महीने के कुछ उपयुक्त 'निष्क्रियता अवधि' का उपयोग करते हुए, प्रत्येक अनुरोध पर उस अवधि के साथ कुकी को ताज़ा करने से कुछ समझ में आता है।
स्टिजन डे विट

@StijndeWitt या सिर्फ 10 साल। फिर इसे अपडेट करें यदि उपयोगकर्ता 10 वर्षों के भीतर ...
Jez

5

हालांकि यह बिल्कुल संभव नहीं है कि आप कुछ ऐसा कर सकते हैं जो Google करता है और अपनी कुकी को 17 जनवरी, 2038 को समाप्त करने के लिए या समान रूप से कुछ दूर तक सेट करें।

सभी व्यावहारिकता में आप अपनी कुकी को 10 साल या 60 * 60 * 24 * 365 * 10 पर सेट करने में बेहतर हो सकते हैं, जो कि आपके कुकी पर रहने वाली अधिकांश मशीनों को रेखांकित करेगा।


2
यह 2028 के प्रारंभ तक काम करेगा, जिस बिंदु पर आप मूल्य को ओवरफ्लो करेंगे और कुकीज़ काम करना बंद कर देंगी। इसके बजाय एक निरपेक्ष मूल्य का उपयोग करने के लिए बेहतर है।
davidjbullock

1
यह मानते हुए कि उसका कोड अभी भी 2028 में पुरानी मशीनों पर चल रहा है ... किसी तरह मैं अधिक चिंतित हूं कि हर कोई निश्चित तारीख को अपडेट करना भूल जाएगा ... सॉफ्टवेयर हार्डवेयर को रेखांकित करता है।
स्टिजन डे विट

4

यदि आप क्लाइंट मशीन पर डेटा को स्थायी रूप से जारी रखना चाहते हैं, तो कम से कम जब तक ब्राउज़र कैश पूरी तरह से खाली नहीं हो जाता है, तब तक जावास्क्रिप्ट मशीन का उपयोग करें:

https://developer.mozilla.org/en-US/docs/DOM/Storage#localStorage

सत्र भंडारण का उपयोग न करें, क्योंकि यह शून्य की अधिकतम आयु वाले कुकी की तरह ही साफ हो जाएगा।


जब सर्वर-साइड डेटा पढ़ने की बात आती है तो कैंट लोकलस्टोरेज पर विचार करता है।
व्हाइटहॉर्स

1

कभी भी और हमेशा के लिए दो शब्द जो मैं जीवन की अप्रत्याशितता के कारण उपयोग करने से बचता हूं।

नवीनतम समय 1 January 1970जो एक हस्ताक्षरित 32-bitपूर्णांक का उपयोग करके संग्रहीत किया जा सकता है 03:14:07 on Tuesday, 19 January 2038( 231-1 = 2,147,483,647सेकंड के बाद 1 January 1970) है । इस सीमा को वर्ष 2038 समस्या के रूप में जाना जाता है

setCookie("name", "value", strtotime("2038-01-19 03:14:07"));

0

मेरा मानना ​​है कि कुकी को हमेशा के लिए अंतिम बनाने का कोई तरीका नहीं है, लेकिन आपको बस इसे भविष्य में समाप्त करने के लिए सेट करने की आवश्यकता है, जैसे कि वर्ष 2100।


0

आपको ऐसा नहीं करना चाहिए और वैसे भी यह संभव नहीं है, यदि आप चाहते हैं कि आप 10 साल आगे जैसे अधिक मूल्य निर्धारित कर सकें।

वैसे, मैंने ऐसी आवश्यकता के साथ कभी कुकी नहीं देखी है :)


मैं विशिष्ट रूप से उत्तर देने वाले चुनावों के लिए कुकीज़ को मानूंगा जो कई प्रविष्टियों को रोकने के साथ बहुत परेशान नहीं करना चाहते हैं।
रैंडम एलीफेंट

@sarfraz को अपने कंप्यूटर की कुकी में से देखें जो आप खाते हैं।
जाले

-1

मुझे यकीन नहीं है, लेकिन ब्राउज़र के निकट कुकीज़ नष्ट नहीं हुई हैं? मैं किसी भी तरह कभी नहीं समाप्त होने वाली कुकी और क्रोम की समय-सीमा समाप्त तिथि को "ब्राउज़र के करीब" के रूप में पहचानता था ...


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

-2

आप नहीं कर सकते, लेकिन क्या होगा अगर आपने समय समाप्त किया + 100 साल?


3
नहीं, क्योंकि यह जनवरी 2038 में अधिकतम मूल्य से अधिक होगा।
davidjbullock
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.