2010-07-20 6 views
143

En regardant le php documentation on setting a 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 donné dans le futur, mais je ne vois pas comment régler le cookie pour qu'il n'expire jamais. Est-ce même possible et comment cela est-il accompli?Définir un cookie pour ne jamais expirer

+0

Vous ne devriez pas faire cela. – Sarfraz

+11

@sAc: Pourquoi est-ce une mauvaise chose? – brainimus

+1

Parce que cela n'est pas possible selon la spécification des cookies. Il ne peut pas être configuré pour ne jamais expirer. – Sarfraz

Répondre

202

Tous les cookies expirent conformément au cookie specification, donc ce n'est pas une limitation de PHP.

Utilisez une date future éloignée. Par exemple, définir un cookie qui expire en dix ans:

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

Notez que si vous définissez une date passée en PHP, le nombre se terminera autour et vous aurez un cookie qui expire instantanément.

+7

D'accord! Et je pense que dans 20 ans, les sites Web seront loin, que peut-être pas de cookies seront utilisés .. @brainimus: Il suffit d'utiliser tout le monde système oldschool mentionné - heure actuelle + temps dans un avenir lointain! – jolt

+13

Prenez garde que quand 2018 arrive, si nous ne sommes pas en PHP 64 bits, que cela va enrouler autour de l'entier de 32 bits et sont envoyés au client comme un temps proche de zéro. (Ceci se produit actuellement pour les cookies de 25 ans sur PHP.) – Riking

+0

@Riking bonne prise. Temps de migrer;) –

0

Je crois qu'il n'y a pas un moyen de faire un cookie durer pour toujours, mais il faut juste qu'il devait expirer loin dans l'avenir, comme l'année 2100.

0

Vous ne pouvez pas, mais ce si vous définissez le délai d'expiration à maintenant + 100 ans?

+1

Non, car cela dépasserait la valeur maximale en janvier 2038. – davidjbullock

0

Vous ne devriez pas faire cela et ce n'est pas possible de toute façon, Si vous voulez, vous pouvez définir une valeur plus grande comme 10 ans à venir.

D'ailleurs, je n'ai jamais vu un cookie avec cette exigence :)

6

Bien que ce ne soit pas exactement possible, vous pouvez faire quelque chose de similaire à ce que Google fait et mettre votre cookie à expiration le 17 janvier 2038 ou quelque chose d'aussi éloigné.

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

+1

Cela fonctionnera jusqu'au début de 2028, à quel point vous déborderez la valeur et les cookies cesseront de fonctionner. Mieux vaut utiliser une valeur absolue à la place. – davidjbullock

+1

En supposant que son code fonctionnera encore sur des machines obsolètes en 2028 ... D'une certaine manière je suis plus inquiet que tout le monde oublie de mettre à jour la date fixe ... Les logiciels ont tendance à survivre au matériel. –

-1

Je ne suis pas sûr mais ne sont pas des cookies supprimés à la fermeture du navigateur? Je l'ai fait en quelque sorte un cookie ne venant à échéance et le chrome reconnu comme la date a expiré « au navigateur fermer » ...

+3

Pas nécessairement, si vous définissez une date d'expiration sur le cookie, il survivra après que vous fermez votre navigateur et rouvrez-le. Si vous ne définissez pas d'expiration, le comportement par défaut sera supprimé lorsque vous fermez votre navigateur. – HoLyVieR

12

Mon privilège me permet de faire mon commentaire sur le premier message de sorte qu'il devra aller ici.

La prise en compte de 2038 unix bug doit être prise en compte lors de la configuration 20 ans à l'avance à partir de la date actuelle, ce qui constitue la bonne réponse ci-dessus.

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

24

Définir un futur lointain temps absolu:

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

Il est préférable d'utiliser un temps absolu de le calculer par rapport à la présente comme recommandé dans la réponse acceptée.

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

2147483647 = 2^31 = ~year 2033 
+21

2 milliards est facile à retenir mais le nombre idéal pour $ forever serait 2^31 - 1 = 2147483647 correspondant à janvier 2038. C'est la valeur maximale pour éviter le débordement d'entier du bogue de 2038 comme l'a dit @John. – David

4

Tu ne peux pas juste dire une boucle sans fin, cookie expire que la date actuelle + 1 afin qu'elle touche jamais la date est censé expirer le parce que c'est toujours demain? Un peu exagéré mais juste en train de dire.

+9

+1 pour une réponse appropriée à "Que ferait Jésus?" ;) – teodron

+1

En fait, il a un point. Le simple fait d'utiliser une «période d'inactivité» appropriée de, disons, 3 mois, puis de rafraîchir le cookie avec cette période à chaque demande est logique. –

+0

@StijndeWitt Ou seulement 10 ans. Puis mettez-le à jour si l'utilisateur visite dans les 10 ans ... – Jez

3

Si vous souhaitez conserver des données sur la machine cliente de façon permanente -ou au moins jusqu'à ce que le cache du navigateur est vidé complètement, utilisez Javascript stockage local:

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

Ne pas utiliser le stockage de session, il sera effacé comme un cookie avec un âge maximum de zéro.

55

Valeur maximale: 2147483647

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

Pour éviter tout débordement d'entier l'horodatage doit être réglé sur:

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

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

Voir aussi la RFC about 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, 14.6 Age:

Si un cache reçoit une valeur plus grande que le plus grand entier positif qu'elle peut représenter, ou si l'un des ses calculs d'âge trop-pleins, il doit transmettre un en-tête d'âge avec une valeur de 21474 83648 (2^31).

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

Questions connexes