ตั้งค่าคุกกี้ให้ไม่มีวันหมดอายุ


187

ดูที่เอกสารประกอบ php เกี่ยวกับการตั้งค่าคุกกี้ฉันเห็นว่าฉันสามารถกำหนดวันหมดอายุสำหรับคุกกี้ได้ คุณสามารถตั้งค่าคุกกี้ให้หมดอายุเมื่อสิ้นสุดเซสชันเบราว์เซอร์หรือบางครั้งในอนาคต แต่ฉันไม่เห็นวิธีตั้งค่าคุกกี้ให้ไม่มีวันหมดอายุ สิ่งนี้เป็นไปได้หรือไม่และสิ่งนี้สำเร็จได้อย่างไร


13
@sAc: ทำไมสิ่งนี้เป็นสิ่งที่ไม่ดี?
brainimus

1
เพราะมันเป็นไปไม่ได้อยู่แล้วตามข้อกำหนดของคุกกี้ ไม่สามารถตั้งค่าให้ไม่มีวันหมดอายุ
Sarfraz

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)
);

โปรดทราบว่าหากคุณตั้งวันที่ที่ผ่านมา2038ใน PHP 32 บิตตัวเลขจะถูกล้อมรอบและคุณจะได้รับคุกกี้ที่หมดอายุทันที


8
ตกลงกัน! และฉันคิดว่าในอีก 20 ปีข้างหน้าเว็บไซต์จะไกลไปกว่านั้นอาจจะไม่มีการใช้คุกกี้ .. @brainimus: เพียงแค่ใช้ระบบ oldschool ที่ทุกคนกล่าวถึง - เวลาปัจจุบัน + เวลาในอนาคตอันไกล!
กระแทก

13
ระวังว่าเมื่อปี 2018 มาถึงถ้าเราไม่ได้ใช้ PHP 64- บิตนั่นจะห่อรอบจำนวนเต็ม 32 บิตและส่งไปยังลูกค้าเมื่อใกล้ศูนย์ (สิ่งนี้กำลังเกิดขึ้นตอนนี้สำหรับคุกกี้ 25 ปีใน PHP)
Riking

83
จะเป็นเรื่องตลกที่จะกลับมาแสดงความคิดเห็นเหล่านี้ในปี 2018 (ห่างออกไปเพียง 5 ปี) และดูว่าทุกคนต่างพยายามที่จะใช้การอัพเกรด Y2018 จากนั้นอีก 20 ปีต่อมาในปี 2038 หวังว่าเราทุกคนจะกระโดด จะไม่เป็นปัญหาอีก 292 พันล้านปีในวันอาทิตย์ที่ 4 ธันวาคม 292,277,026,596 ก่อนที่ฉันจะตายฉันไม่คิดว่าฉันจะต้องกังวลเกี่ยวกับสิ่งนั้น
Shaunhusain

58
ถ้ามีคนกำลังใช้คอมพิวเตอร์เครื่องเดียวกันตอนปลายปี 2580 ที่พวกเขาใช้อยู่ตอนนี้ ... มันคงจะเศร้า!
Abela

22
ฉันกำลังอ่านสิ่งนี้ในปี 2018 ตื่นตระหนกสักครู่แล้วก็รู้ว่าฉันโอเค
Interloper

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 อายุ :

หากแคชได้รับค่าที่มากกว่าจำนวนเต็มบวกที่ใหญ่ที่สุดที่สามารถเป็นตัวแทนได้หรือหากมีการคำนวณอายุมากเกินจำเป็นต้องส่งส่วนหัว Age ด้วยค่า 2147483648 (2 ^ 31)

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


39

กำหนดเวลาที่แน่นอนในอนาคต :

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

จะดีกว่าถ้าใช้เวลาสัมบูรณ์กว่าการคำนวณเทียบกับปัจจุบันตามที่แนะนำในคำตอบที่ยอมรับ

ค่าสูงสุดที่เข้ากันได้กับระบบ 32 บิตคือ:

2147483647 = 2^31 = ~year 2038

22
2 พันล้านจำได้ง่าย แต่ตัวเลขในอุดมคติสำหรับ $ Forever จะเป็น 2 ^ 31 - 1 = 2147483647 ซึ่งตรงกับมกราคม 2038 มันเป็นค่าสูงสุดที่จะหลีกเลี่ยงจำนวนเต็มล้นของบั๊ก 2038 ตามที่ John John กล่าว
David

13

สิทธิ์ของฉันทำให้ฉันไม่สามารถแสดงความคิดเห็นในโพสต์แรกดังนั้นมันจะต้องไปที่นี่

การพิจารณาควรคำนึงถึงข้อผิดพลาดของยูนิกซ์ 2038เมื่อตั้งค่าล่วงหน้า 20 ปีจากวันที่ปัจจุบันซึ่งแนะนำว่าเป็นคำตอบที่ถูกต้องข้างต้น

คุกกี้ของคุณในวันที่ 19 มกราคม 2018 + (20 ปี) อาจประสบปัญหาอย่างมากในปี 2038 ทั้งนี้ขึ้นอยู่กับเบราว์เซอร์และรุ่นที่คุณใช้งาน


7

คุณไม่สามารถบอกว่าวงวนไม่สิ้นสุดคุกกี้หมดอายุตามวันที่ปัจจุบัน + 1 หรือไม่ดังนั้นจึงไม่เคยถึงวันที่ที่ควรจะเป็นเพราะวันพรุ่งนี้เป็นวันที่เสมอ ค่อนข้าง overkill แต่เพียงแค่พูด


1
จริงๆแล้วเขามีประเด็น เพียงใช้ 'ช่วงเวลาที่ไม่มีการใช้งาน' ที่เหมาะสมแล้วให้พูด 3 เดือนแล้วจึงรีเฟรชคุกกี้ในช่วงเวลานั้นในแต่ละคำขอ
Stijn de Witt

@ StijndeWitt หรือเพียง 10 ปี จากนั้นปรับปรุงมันถ้าผู้ใช้เข้าชมภายใน 10 ปี ...
Jez

5

แม้ว่าจะเป็นไปไม่ได้อย่างแน่นอน แต่คุณสามารถทำสิ่งที่คล้ายกับที่ Google ทำและตั้งค่าคุกกี้ของคุณให้หมดอายุในวันที่ 17 มกราคม 2038

ในทุกการปฏิบัติจริงคุณอาจดีกว่าการตั้งค่าคุกกี้ของคุณเป็นเวลา 10 ปีหรือ 60 * 60 * 24 * 365 * 10 ซึ่งควรจะอยู่ได้นานกว่าเครื่องส่วนใหญ่ที่คุกกี้ของคุณจะใช้งานได้


2
สิ่งนี้จะใช้ได้จนถึงต้นปี 2571 ซึ่งคุณจะล้นเกินมูลค่าและคุกกี้จะหยุดทำงาน ควรใช้ค่าสัมบูรณ์แทนดีกว่า
davidjbullock

1
สมมติว่ารหัสของเขาจะยังคงทำงานบนเครื่องที่ล้าสมัยในปี 2028 ... ฉันกังวลมากขึ้นว่าทุกคนจะลืมอัปเดตวันที่กำหนด ... ซอฟต์แวร์มีแนวโน้มที่จะมีอายุการใช้งานยาวนานกว่าฮาร์ดแวร์
Stijn de Witt

4

หากคุณต้องการคงข้อมูลไว้ในเครื่องไคลเอนต์อย่างถาวรหรืออย่างน้อยก็จนกว่าแคชของเบราว์เซอร์จะถูกทำให้ว่างเปล่าให้ใช้ที่เก็บข้อมูลภายใน Javascript:

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

อย่าใช้ที่เก็บข้อมูลเซสชันเนื่องจากจะถูกล้างเหมือนกับคุกกี้ที่มีอายุสูงสุดเป็นศูนย์


ไม่สามารถพิจารณา localStorage เมื่อพูดถึงการอ่านข้อมูลฝั่งเซิร์ฟเวอร์
WhiteHorse

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
ไม่เพราะนั่นจะเกินค่าสูงสุดในเดือนมกราคม 2581
davidjbullock
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.