web-dev-qa-db-fra.com

Définir un cookie pour qu'il n'expire jamais

En regardant le documentation php sur la configuration d'un cookie je vois que je peux définir une date d'expiration pour le cookie. Vous pouvez définir le cookie pour qu'il expire à la fin de la session du navigateur ou à un moment ultérieur, mais je ne vois pas le moyen de configurer le cookie pour qu'il n'expire jamais. Est-ce même possible et comment cela est-il accompli?

172
brainimus

Tous les cookies expirent conformément à la spécification de cookie , il ne s'agit donc pas d'une limitation PHP.

Utilisez une date future lointaine. Par exemple, définissez un cookie qui expire dans dix ans:

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

Notez que si vous définissez une date passée 2038 en PHP 32 bits, le numéro sera bouclé et vous obtiendrez un cookie qui expirera instantanément.

238
Joeri Hendrickx

Valeur maximale: 2147483647

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

Pour éviter le dépassement d'entier, l'horodatage doit être réglé sur:

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

Définir une valeur plus élevée peut causer des problèmes avec les anciens navigateurs.

Voir également le RFC sur les 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.

et RFC 2616, âge 14.6 :

Si un cache reçoit une valeur supérieure au nombre entier positif le plus grand qu'il peut représenter, ou si l'un de ses calculs d'âge déborde, il DOIT transmettre un en-tête Age avec une valeur de 2147483648 (2 ^ 31).

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

65
PiTheNumber

Définir un temps absolu futur lointain:

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

Il est préférable d’utiliser un temps absolu plutôt que de le calculer par rapport au présent comme recommandé dans la réponse acceptée.

La valeur maximale compatible avec les systèmes 32 bits est:

2147483647 = 2^31 = ~year 2038
33
David

Mon privilège m'empêche de faire mon commentaire sur le premier post, il devra donc aller ici.

Il faut tenir compte de bogue 2038 unix lors de la configuration 20 ans à l’avance à partir de la date actuelle, ce qui est suggéré comme la réponse correcte ci-dessus.

Votre cookie du 19 janvier 2018 et plus (20 ans) pourrait bien rencontrer un problème selon 2038, selon le navigateur et/ou les versions que vous utilisez.

13
John

Ne pouvez-vous pas simplement dire qu'une boucle sans fin, le cookie expire à la date du jour + 1, de sorte qu'il ne correspond jamais à la date à laquelle il est censé expirer, car c'est toujours demain? Un peu exagéré mais juste dire.

7
Jesus

Bien que cela ne soit pas tout à fait possible, vous pouvez faire quelque chose de similaire à ce que fait Google et définir votre cookie pour qu'il expire le 17 janvier 2038 ou quelque chose d'aussi lointain.

En pratique, il vaudrait peut-être mieux installer votre cookie pendant 10 ans ou 60 * 60 * 24 * 365 * 10, ce qui devrait survivre à la plupart des machines sur lesquelles votre cookie vivra.

6
h3r2on

Si vous souhaitez conserver les données sur l'ordinateur client de manière permanente, ou au moins jusqu'à ce que le cache du navigateur soit complètement vidé, utilisez le stockage local Javascript:

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

N'utilisez pas de stockage de session, il sera effacé comme un cookie dont l'âge maximum est de zéro.

4
Björn

Je crois qu’il n’ya pas de moyen de faire durer un cookie pour toujours, mais il suffit de le configurer pour qu’il expire très longtemps, comme en 2100.

0
Joel Kennedy

Vous ne pouvez pas, mais que se passe-t-il si vous définissez l'heure d'expiration pour maintenant + 100 ans?

0
Boris Delormas

Vous ne devriez pas faire cela et ce n’est de toute façon pas possible. Si vous le souhaitez, vous pouvez définir une valeur supérieure, telle que 10 ans à l’avenir.

Au fait, je n'ai jamais vu de cookie avec une telle exigence :)

0
Sarfraz