Establecer una cookie para que nunca caduque

187

Al mirar la documentación de php sobre la configuración de una cookie , veo que puedo establecer una fecha de vencimiento para la cookie. Puede configurar la cookie para que caduque al final de la sesión del navegador o en algún momento en el futuro, pero no veo una manera de configurar la cookie para que nunca caduque. ¿Es esto posible y cómo se logra?

Brainimus
fuente
13
@sAc: ¿Por qué es esto algo malo?
brainimus
1
Porque eso no es posible de todos modos según la especificación de cookies. No se puede configurar para que nunca caduque.
Sarfraz
2
Puede usar $cookie->setMaxAge(2147483647);, que es posterior a 2080 y funciona tanto en 32 bits como en 64 bits, con github.com/delight-im/PHP-Cookie
caw

Respuestas:

261

Todas las cookies caducan según la especificación de cookies , por lo que esto no es una limitación de PHP.

Use una fecha futura lejana. Por ejemplo, configure una cookie que caduque en diez años:

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

Tenga en cuenta que si establece una fecha posterior a 2038 en PHP de 32 bits, el número se ajustará y obtendrá una cookie que caduca instantáneamente.

Joeri Hendrickx
fuente
8
¡Convenido! Y creo que en 20 años, los sitios web estarán muy por delante, que posiblemente no se utilizarán cookies. @Brainimus: ¡Solo use el sistema de la vieja escuela que todos mencionaron - hora actual + hora en un futuro lejano!
sacudida
13
Tenga en cuenta que cuando llegue 2018, si no estamos usando PHP de 64 bits, esto envolverá el entero de 32 bits y se enviará al cliente como un tiempo cercano a cero. (Esto está sucediendo en este momento para las cookies de 25 años en PHP.)
Riking
83
Será divertido volver a estos comentarios en 2018 (a solo 5 años de distancia ahora) y ver cómo todos se apresuran a implementar la actualización Y2018 y nuevamente 20 años más tarde en 2038. Esperemos que todos saltemos a todo en 64 bits para entonces. no será un problema por otros 292 mil millones de años el domingo 4 de diciembre 292,277,026,596. A menos que alcancemos una singularidad antes de morir, no creo que tenga que preocuparme por eso.
shaunhusain
58
Si una persona está usando la misma computadora a fines de 2037 que está usando ahora ... ¡eso sería triste!
Abela
23
Leí esto en 2018, entré en pánico por un momento, luego me di cuenta de que estaba bien.
The Interloper
80

Valor máximo: 2147483647

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

Para evitar el desbordamiento de enteros, la marca de tiempo debe establecerse en:

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

Establecer un valor más alto puede causar problemas con los navegadores más antiguos.

Consulte también el RFC sobre cookies :

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.

y RFC 2616, 14.6 Edad :

Si un caché recibe un valor mayor que el entero positivo más grande que puede representar, o si alguno de sus cálculos de antigüedad se desborda, DEBE transmitir un encabezado de Edad con un valor de 2147483648 (2 ^ 31).

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

PiTheNumber
fuente
39

Establezca un tiempo absoluto futuro lejano :

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

Es mejor usar un tiempo absoluto que calcularlo en relación con el presente como se recomienda en la respuesta aceptada.

El valor máximo compatible con sistemas de 32 bits es:

2147483647 = 2^31 = ~year 2038
David
fuente
23
Es fácil recordar 2 mil millones, pero el número ideal para $ para siempre sería 2 ^ 31 - 1 = 2147483647 correspondiente a enero de 2038. Es el valor máximo para evitar el desbordamiento de entero del error 2038 como dijo @John.
David
13

Mi privilegio me impide hacer mi comentario en la primera publicación, por lo que tendrá que ir aquí.

Se debe tener en cuenta el error 2038 de Unix cuando se establece con 20 años de anticipación desde la fecha actual, lo que se sugiere como la respuesta correcta anterior.

Su cookie el 19 de enero de 2018 + (20 años) podría alcanzar el problema 2038 dependiendo del navegador y / o las versiones en las que termine ejecutándose.

Juan
fuente
7

¿No puedes decir que un bucle sin fin, la cookie caduca como fecha actual + 1 para que nunca llegue a la fecha en que se supone que caduque porque siempre es mañana? Un poco exagerado pero solo diciendo.

Jesús
fuente
1
En realidad, él tiene un punto. Solo tiene sentido usar un 'período de inactividad' adecuado de, digamos, 3 meses y luego actualizar la cookie con ese período en cada solicitud.
Stijn de Witt
@StijndeWitt O solo 10 años. Luego actualícelo si el usuario visita dentro de 10 años ...
Jez
5

Si bien eso no es exactamente posible, podría hacer algo similar a lo que hace Google y configurar su cookie para que caduque el 17 de enero de 2038 o algo igualmente lejano.

En la práctica, es mejor que configure su cookie durante 10 años o 60 * 60 * 24 * 365 * 10, lo que debería sobrevivir a la mayoría de las máquinas en las que vivirá su cookie.

h3r2on
fuente
2
Eso funcionará hasta principios de 2028, momento en el que desbordará el valor y las cookies dejarán de funcionar. Es mejor usar un valor absoluto en su lugar.
davidjbullock
1
Suponiendo que su código todavía se ejecutará en máquinas obsoletas en 2028 ... De alguna manera, estoy más preocupado de que todos se olviden de actualizar la fecha fija ... El software tiende a sobrevivir al hardware.
Stijn de Witt
4

Si desea conservar los datos en la máquina del cliente de forma permanente, o al menos hasta que el caché del navegador se vacíe por completo, use el almacenamiento local de Javascript:

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

No use el almacenamiento de sesión, ya que se borrará como una cookie con una edad máxima de cero.

Björn
fuente
No puedo considerar localStorage cuando se trata de leer datos del lado del servidor.
WhiteHorse
1

Nunca y para siempre son dos palabras que evito usar debido a la imprevisibilidad de la vida.

El último tiempo desde 1 January 1970que se puede almacenar usando un 32-bitentero con signo es 03:14:07 on Tuesday, 19 January 2038( 231-1 = 2,147,483,647segundos después 1 January 1970) . Esta limitación se conoce como el problema del año 2038

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

Creo que no hay una manera de hacer que una cookie dure para siempre, pero solo necesita configurarla para que caduque en el futuro, como el año 2100.

Joel Kennedy
fuente
0

No debe hacer eso y eso no es posible de todos modos. Si lo desea, puede establecer un valor mayor, como 10 años por delante.

Por cierto, nunca he visto una cookie con tal requisito :)

Sarfraz
fuente
Supongo que las cookies para las encuestas respondidas de manera única que no quieren molestarse demasiado en evitar múltiples entradas tienen este requisito.
Elefante aleatorio el
mira @sarfraz es la cookie de la computadora, no las que comes.
webs
-1

No estoy seguro, pero ¿no se eliminan las cookies al cerrar el navegador? De alguna manera hice una cookie que nunca caducó y Chrome reconoció la fecha de caducidad como "al cerrar el navegador" ...

azul mientras
fuente
44
No necesariamente, si establece una fecha de vencimiento en la cookie, sobrevivirá después de cerrar su navegador y volver a abrirlo. Si no establece una caducidad, el comportamiento predeterminado se eliminará cuando cierre su navegador.
HoLyVieR
-2

No puede, pero ¿qué pasa si establece el tiempo de vencimiento ahora + 100 años?

Boris Delormas
fuente
3
No, porque eso excedería el valor máximo en enero de 2038.
davidjbullock