Imposta un cookie per non scadere mai


187

Guardando la documentazione php sull'impostazione di un cookie, vedo che posso impostare una data di scadenza per il cookie. È possibile impostare la scadenza del cookie al termine della sessione del browser o in futuro, ma non vedo un modo per impostare il cookie affinché non scada mai. È anche possibile e come viene realizzato?


13
@sAc: Perché questa è una brutta cosa?
brainimus,

1
Perché ciò non è possibile secondo le specifiche sui cookie. Non può essere impostato per non scadere mai.
Sarfraz,

2
È possibile utilizzare $cookie->setMaxAge(2147483647);, che è dopo il 2080 e funziona sia a 32-bit e 64-bit, con github.com/delight-im/PHP-Cookie
caw

Risposte:


260

Tutti i cookie scadono secondo le specifiche dei cookie , quindi questa non è una limitazione di PHP.

Usa una data molto futura. Ad esempio, imposta un cookie che scade tra dieci anni:

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

Nota che se imposti una data oltre il 2038 in PHP a 32 bit, il numero verrà spostato e otterrai un cookie che scade all'istante.


8
Concordato! E penso che tra 20 anni i siti web saranno molto più avanti, che probabilmente non verranno utilizzati i cookie.
scossa

13
Fai attenzione che quando arriva il 2018, se non utilizziamo PHP a 64 bit, questo avvolgerà l'intero numero intero a 32 bit e verrà inviato al client come un tempo vicino allo zero. (Questo sta accadendo in questo momento per i cookie di 25 anni su PHP.)
Riking

83
Sarà divertente tornare a questi commenti nel 2018 (a soli 5 anni di distanza) e vedere come tutti si affrettano a implementare l'aggiornamento Y2018 e poi di nuovo 20 anni dopo nel 2038. Speriamo che tutti noi faremo il salto a 64 bit tutto da allora questo non sarà un problema per altri 292 miliardi di anni domenica 4 dicembre 292.277.026.596. A meno che non raggiungiamo una singolarità prima di morire, non credo che dovrò preoccuparmi di quella.
Shaunhusain,

58
Se una persona sta usando lo stesso computer alla fine del 2037 che stanno usando ora ... sarebbe solo triste!
Abela,

23
Lo sto leggendo nel 2018, in preda al panico per un momento, poi ho capito che stavo bene.
The Interloper

80

Valore massimo: 2147483647

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

Per evitare l'overflow dei numeri interi, il timestamp deve essere impostato su:

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

L'impostazione di un valore più alto potrebbe causare problemi con i browser meno recenti.

Vedi anche la RFC sui 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.

e RFC 2616, 14.6 Età :

Se una cache riceve un valore maggiore del numero intero positivo più grande che può rappresentare o se uno dei suoi calcoli sull'età trabocca, DEVE trasmettere un'intestazione Age con un valore di 2147483648 (2 ^ 31).

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


39

Imposta un tempo assoluto lontano futuro :

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

È meglio usare un tempo assoluto piuttosto che calcolarlo rispetto al presente come raccomandato nella risposta accettata.

Il valore massimo compatibile con i sistemi a 32 bit è:

2147483647 = 2^31 = ~year 2038

23
2 miliardi è facile da ricordare, ma il numero ideale per $ per sempre sarebbe 2 ^ 31 - 1 = 2147483647 corrispondente a gennaio 2038. È il valore massimo per evitare l'overflow di numeri interi dell'insetto 2038 come ha detto @John.
David,

13

Il mio privilegio mi impedisce di commentare il primo post, quindi dovrà andare qui.

È necessario tenere conto del bug unix 2038 quando si imposta 20 anni in anticipo dalla data corrente, che viene suggerita come la risposta corretta sopra.

Il tuo cookie il 19 gennaio 2018 + (20 anni) potrebbe colpire il problema 2038 a seconda del browser e delle versioni su cui finisci per essere eseguito.


7

Non puoi semplicemente dire un ciclo infinito, il cookie scade come data corrente + 1, quindi non raggiunge mai la data in cui dovrebbe scadere perché è sempre domani? Un po 'eccessivo ma solo dicendo.


1
In realtà, ha ragione. Usare un "periodo di inattività" adeguato, per esempio, di 3 mesi e quindi aggiornare il cookie con quel periodo su ogni richiesta ha un senso.
Stijn de Witt,

@StijndeWitt O solo 10 anni. Quindi aggiornalo se l'utente visita entro 10 anni ...
Jez

5

Sebbene ciò non sia esattamente possibile, potresti fare qualcosa di simile a quello che fa Google e impostare la scadenza dei cookie il 17 gennaio 2038 o qualcosa di altrettanto lontano.

In tutta praticità potresti stare meglio impostando il tuo cookie per 10 anni o 60 * 60 * 24 * 365 * 10, che dovrebbe sopravvivere alla maggior parte delle macchine su cui vivrà il tuo cookie.


2
Funzionerà fino all'inizio del 2028, a quel punto traverai il valore e i cookie smetteranno di funzionare. Meglio usare un valore assoluto invece.
davidjbullock,

1
Supponendo che il suo codice sarà ancora in esecuzione su macchine obsolete nel 2028 ... In qualche modo sono più preoccupato che tutti dimenticheranno di aggiornare la data fissa ... Il software tende a sopravvivere all'hardware.
Stijn de Witt,

4

Se si desidera conservare permanentemente i dati sul computer client, o almeno fino a quando la cache del browser non viene svuotata completamente, utilizzare l'archiviazione locale Javascript:

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

Non utilizzare l'archiviazione di sessione, poiché verrà cancellato proprio come un cookie con un'età massima di Zero.


Non posso considerare localStorage quando si tratta di leggere dati sul lato server.
WhiteHorse

1

Mai e per sempre sono due parole che evito di usare a causa dell'imprevedibilità della vita.

L'ultima volta 1 January 1970che può essere memorizzata utilizzando un 32-bitnumero intero con segno è 03:14:07 on Tuesday, 19 January 2038( 231-1 = 2,147,483,647secondi dopo 1 January 1970) . Questa limitazione è nota come problema dell'anno 2038

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

0

Credo che non ci sia un modo per far durare un cookie per sempre, ma devi solo impostarlo in modo che scada lontano nel futuro, come l'anno 2100.


0

Non dovresti farlo e comunque non è possibile, se vuoi puoi impostare un valore maggiore come 10 anni in anticipo.

A proposito, non ho mai visto un cookie con tale requisito :)


Suppongo che i cookie per i sondaggi con risposta univoca che non vogliono preoccuparsi troppo di prevenire voci multiple abbiano questo requisito.
Random Elephant,

guarda @sarfraz è il cookie del computer non quelli che mangi.
webs

-1

Non sono sicuro ma i cookie non vengono cancellati alla chiusura del browser? In qualche modo ho fatto un cookie senza scadenza e Chrome ha riconosciuto la data di scadenza come "alla chiusura del browser" ...


4
Non necessariamente, se imposti una data di scadenza sul cookie, sopravviverà dopo aver chiuso il browser e averlo riaperto. Se non si imposta una scadenza, il comportamento predefinito verrà eliminato alla chiusura del browser.
HoLyVieR,

-2

Non puoi, ma se imposti il ​​tempo di scadenza a ora + 100 anni?


3
No, perché questo supererebbe il valore massimo nel gennaio 2038.
davidjbullock
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.