Đặt cookie để không bao giờ hết hạn


187

Nhìn vào tài liệu php về việc đặt cookie tôi thấy rằng tôi có thể đặt ngày hết hạn cho cookie. Bạn có thể đặt cookie hết hạn vào cuối phiên trình duyệt hoặc vào một lúc nào đó trong tương lai nhưng tôi không thấy cách nào để đặt cookie thành không bao giờ hết hạn. Điều này thậm chí có thể và làm thế nào là hoàn thành?


13
@sAc: Tại sao điều này là một điều xấu?
brainimus

1
Bởi vì điều đó là không thể dù sao theo đặc điểm kỹ thuật cookie. Nó không thể được thiết lập để không bao giờ hết hạn.
Sarfraz

2
Bạn có thể sử dụng $cookie->setMaxAge(2147483647);, muộn hơn 2080 và hoạt động trên cả 32 bit và 64 bit, với github.com/delight-im/PHP-Cookie
caw

Câu trả lời:


259

Tất cả các cookie hết hạn theo đặc tả cookie , vì vậy đây không phải là giới hạn của PHP.

Sử dụng một ngày trong tương lai xa. Ví dụ: đặt cookie hết hạn sau mười năm:

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

Lưu ý rằng nếu bạn đặt ngày qua 2038 trong PHP 32 bit, số đó sẽ bao quanh và bạn sẽ nhận được một cookie hết hạn ngay lập tức.


8
Đã đồng ý! Và tôi nghĩ rằng, trong 20 năm nữa, các trang web sẽ tiến xa hơn, có thể sẽ không có cookie nào được sử dụng .. @brainimus: Chỉ cần sử dụng hệ thống oldschool mà mọi người đã đề cập - thời gian hiện tại + thời gian trong tương lai xa!
giật

13
Xin lưu ý rằng khi năm 2018 xuất hiện, nếu chúng ta không sử dụng PHP 64 bit, thì điều này sẽ bao quanh số nguyên 32 bit và được gửi đến máy khách dưới dạng thời gian gần bằng không. (Điều này đang xảy ra ngay bây giờ đối với các cookie 25 năm trên PHP.)
Đi xe đạp

83
Sẽ rất buồn cười khi quay lại những bình luận này vào năm 2018 (chỉ cách đây 5 năm) và thấy mọi người tranh nhau thực hiện nâng cấp Y2018 sau đó 20 năm sau vào năm 2038. Hy vọng tất cả chúng ta sẽ nhảy lên 64 bit sau đó sẽ không còn là vấn đề trong 29 tỷ năm nữa vào Chủ nhật, ngày 4 tháng 12, 292.277.026.596. Trừ khi chúng ta đạt đến điểm kỳ dị trước khi chết, tôi không nghĩ mình sẽ phải lo lắng về điều đó.
shaunhusain

58
Nếu một người đang sử dụng cùng một máy tính vào cuối năm 2037 mà họ đang sử dụng ... điều đó thật đáng buồn!
Abela

22
Tôi đang đọc cái này vào năm 2018, hoảng loạn một lúc, rồi nhận ra mình vẫn ổn.
Interloper

80

Giá trị tối đa: 2147483647

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

Để tránh tràn số nguyên, dấu thời gian phải được đặt thành:

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

Đặt giá trị cao hơn có thể gây ra sự cố với các trình duyệt cũ hơn.

Cũng xem RFC về cookie :

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 Tuổi :

Nếu bộ đệm nhận được giá trị lớn hơn số nguyên dương lớn nhất mà nó có thể biểu thị hoặc nếu bất kỳ phép tính tuổi nào của nó bị tràn, thì PHẢI truyền tiêu đề Age có giá trị 2147483648 (2 ^ 31).

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


39

Đặt thời gian tuyệt đối trong tương lai xa :

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

Tốt hơn là sử dụng thời gian tuyệt đối hơn là tính toán nó so với hiện tại như được đề xuất trong câu trả lời được chấp nhận.

Giá trị tối đa tương thích với các hệ thống 32 bit là:

2147483647 = 2^31 = ~year 2038

22
2 tỷ dễ nhớ nhưng con số lý tưởng cho $ mãi mãi sẽ là 2 ^ 31 - 1 = 2147483647 tương ứng với tháng 1 năm 2038. Đây là giá trị tối đa để tránh tràn số nguyên của lỗi 2038 như @John nói.
David

13

Đặc quyền của tôi ngăn cản tôi đưa ra nhận xét của mình về bài đăng đầu tiên vì vậy nó sẽ phải vào đây.

Cần xem xét đến 2038 lỗi unix khi đặt trước 20 năm kể từ ngày hiện tại được đề xuất là câu trả lời đúng ở trên.

Cookie của bạn vào ngày 19 tháng 1 năm 2018 + (20 năm) có thể gặp sự cố 2038 tùy thuộc vào trình duyệt và các phiên bản mà bạn kết thúc chạy.


7

Bạn không thể nói một vòng lặp không bao giờ kết thúc, cookie sẽ hết hạn vào ngày hiện tại + 1 vì vậy nó không bao giờ đạt đến ngày mà nó dự định sẽ hết hạn bởi vì nó luôn luôn là vào ngày mai? Một chút quá mức nhưng chỉ nói.


1
Thật ra, anh có một điểm. Chỉ cần sử dụng một số 'thời gian không hoạt động' phù hợp, giả sử, 3 tháng và sau đó làm mới cookie với khoảng thời gian đó trên mỗi yêu cầu sẽ có ý nghĩa.
Stijn de Witt

@StijndeWitt Hoặc chỉ 10 năm. Sau đó cập nhật nó nếu người dùng truy cập trong vòng 10 năm ...
Jez

5

Mặc dù điều đó không chính xác, bạn có thể làm điều gì đó tương tự như những gì Google làm và đặt cookie của bạn hết hạn vào ngày 17 tháng 1 năm 2038 hoặc một cái gì đó không kém phần xa vời.

Trong thực tế, bạn có thể tốt hơn nên đặt cookie của mình trong 10 năm hoặc 60 * 60 * 24 * 365 * 10, điều này sẽ tồn tại lâu hơn hầu hết các máy mà cookie của bạn sẽ tồn tại.


2
Điều đó sẽ hoạt động cho đến đầu năm 2028, tại thời điểm đó, bạn sẽ tràn giá trị và cookie sẽ ngừng hoạt động. Tốt hơn là sử dụng một giá trị tuyệt đối thay thế.
davidjbullock

1
Giả sử mã của anh ấy vẫn sẽ chạy trên các máy lỗi thời vào năm 2028 ... Bằng cách nào đó tôi lo lắng hơn rằng mọi người sẽ quên cập nhật ngày cố định ... Phần mềm có xu hướng tồn tại lâu hơn phần cứng.
Stijn de Witt

4

Nếu bạn muốn duy trì dữ liệu trên máy khách vĩnh viễn - hoặc ít nhất cho đến khi bộ nhớ cache của trình duyệt hoàn toàn bị xóa, hãy sử dụng bộ nhớ cục bộ Javascript:

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

Không sử dụng lưu trữ phiên, vì nó sẽ bị xóa giống như một cookie có tuổi tối đa là Zero.


Không thể xem xét localStorage khi đọc dữ liệu phía máy chủ.
WhiteHorse

1

Không bao giờmãi mãi là hai từ mà tôi tránh sử dụng do sự khó lường của cuộc sống.

Lần gần nhất kể từ 1 January 1970đó có thể được lưu trữ bằng 32-bitsố nguyên đã ký là 03:14:07 on Tuesday, 19 January 2038( 231-1 = 2,147,483,647giây sau 1 January 1970) . Giới hạn này được gọi là vấn đề Năm 2038

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

0

Tôi tin rằng không có cách nào để tạo cookie tồn tại mãi mãi, nhưng bạn chỉ cần đặt nó hết hạn trong tương lai, chẳng hạn như năm 2100.


0

Dù sao thì bạn cũng không nên làm điều đó và điều đó là không thể, Nếu bạn muốn bạn có thể đặt một giá trị lớn hơn như 10 năm tới.

Nhân tiện, tôi chưa bao giờ thấy một cookie với yêu cầu như vậy :)


Tôi sẽ giả sử cookie cho các cuộc thăm dò được trả lời duy nhất mà không muốn làm phiền quá nhiều với việc ngăn chặn nhiều mục có yêu cầu này.
Voi ngẫu nhiên

Hãy xem @sarfraz đó là cookie máy tính chứ không phải những cái bạn ăn.
web

-1

Tôi không chắc chắn nhưng không xóa cookie tại trình duyệt đóng? Tôi bằng cách nào đó đã làm một cookie không bao giờ hết hạn và chrome nhận ra ngày hết hạn là "lúc đóng trình duyệt" ...


4
Không nhất thiết, nếu bạn đặt ngày hết hạn trên cookie, nó sẽ tồn tại sau khi bạn đóng trình duyệt và mở lại. Nếu bạn không đặt hết hạn, hành vi mặc định sẽ bị xóa khi bạn đóng trình duyệt.
HoLyVieR

-2

Bạn không thể nhưng nếu bạn đặt thời gian hết hạn đến bây giờ + 100 năm thì sao?


3
Không, bởi vì điều đó sẽ vượt quá giá trị tối đa vào tháng 1 năm 2038.
davidjbullock
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.