Setați un modul cookie să nu expire niciodată (Programare, Php, Cookie-Uri)

brainimus a intrebat.

Privind la documentația php privind setarea unui cookie văd că pot seta o dată de expirare pentru cookie. Poți seta cookie-ul să expire la sfârșitul sesiunii browserului sau la un moment dat în viitor, dar nu văd o modalitate de a seta cookie-ul să nu expire niciodată. Este posibil acest lucru și cum se realizează acest lucru?

Comentarii

  • @sAc: De ce este acesta un lucru rău? –  > Por brainimus.
  • Pentru că acest lucru nu este posibil oricum, conform specificațiilor cookie-urilor. Acesta nu poate fi setat să nu expire niciodată. –  > Por Sarfraz.
  • Puteți utiliza $cookie->setMaxAge(2147483647);, care este mai recentă decât 2080 și funcționează atât pe 32 de biți, cât și pe 64 de biți, cu github.com/delight-im/PHP-Cookie –  > Por caw.
12 răspunsuri
Joeri Hendrickx

Toate modulele cookie expiră în conformitate cu specificația cookie-urilor, deci aceasta nu este o limitare a PHP.

Folosiți o dată îndepărtată în viitor. De exemplu, setați un modul cookie care expiră peste zece ani:

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

Rețineți că dacă setați o dată trecută de 2038 în PHP pe 32 de biți, numărul se va înfășura și veți obține un modul cookie care expiră instantaneu.

Comentarii

  • Aveți grijă ca atunci când se va întâmpla 2018, dacă nu folosim PHP pe 64 de biți, acest lucru să se înfășoare în jurul numărului întreg pe 32 de biți și să fie trimis către client ca o dată apropiată de zero. (Acest lucru se întâmplă chiar acum pentru cookie-urile de 25 de ani pe PHP).  > Por Riking.
  • 88

  • Va fi amuzant să revenim la aceste comentarii în 2018 (la doar 5 ani distanță acum) și să vedem cum toată lumea se grăbește să implementeze actualizarea Y2018, apoi din nou 20 de ani mai târziu, în 2038. Să sperăm că vom face cu toții saltul la totul pe 64 de biți până atunci, acest lucru nu va mai fi o problemă pentru încă 292 de miliarde de ani, duminică, 4 decembrie 292.277.026.596. Cu excepția cazului în care vom ajunge la o singularitate înainte de a muri, nu cred că va trebui să-mi fac griji în această privință. –  > Por shaunhusain.
  • 61

  • Dacă o persoană va folosi la sfârșitul anului 2037 același computer pe care îl folosește acum… ar fi pur și simplu trist! –  > Por Abela.
  • 27

  • Citesc asta în 2018, m-am panicat pentru un moment, apoi mi-am dat seama că sunt bine. –  > Por Interlopul.
  • Bună ziua, dragi călători în timp, vă vorbesc de departe, din 2019. Planeta noastră s-a schimbat foarte mult. Căutăm locuri în univers pentru a ne salva specia. Între timp, încă folosim cookie-uri. –  > Por Tim van Uum.
PiTheNumber

Valoarea maximă: 2147483647

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

Pentru a evita depășirea numărului de numere întregi, marca temporală trebuie setată la:

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

Setarea unei valori mai mari poate cauza probleme cu browserele mai vechi.

A se vedea și RFC despre cookie-uri:

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.

și RFC 2616, 14.6 Vârsta:

În cazul în care o memorie cache primește o valoare mai mare decât cel mai mare număr întreg pozitiv pe care îl poate reprezenta sau dacă oricare dintre calculele sale privind vârsta se depășește, aceasta TREBUIE să transmită un antet Age cu valoarea 2147483648 (2^31).

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

David

Setați un timp absolut din viitorul îndepărtat:

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

Este mai bine să folosiți un timp absolut decât să îl calculați în raport cu prezentul, așa cum se recomandă în răspunsul acceptat.

Valoarea maximă compatibilă cu sistemele pe 32 de biți este:

2147483647 = 2^31 = ~year 2038

Comentarii

    24

  • 2 miliarde este ușor de reținut, dar numărul ideal pentru $forever ar fi 2^31 – 1 = 2147483647, corespunzând lunii ianuarie 2038. Este valoarea maximă pentru a evita depășirea de numere întregi din cauza bug-ului 2038, așa cum a spus @John. –  > Por David.
John

Privilegiul meu mă împiedică să-mi fac comentariul la prima postare, așa că va trebui să meargă aici.

Ar trebui să se ia în considerare 2038 bug unix atunci când se setează cu 20 de ani în avans față de data curentă care este sugerată ca răspuns corect mai sus.

Cookie-ul dvs. pe 19 ianuarie 2018 + (20 ani) ar putea foarte bine să se lovească de problema 2038 în funcție de browserul și sau versiunile pe care ajungeți să le executați.

Jesus

Nu poți spune doar o buclă fără sfârșit, cookie-ul expiră ca data curentă + 1, astfel încât să nu atingă niciodată data la care ar trebui să expire, deoarece este întotdeauna mâine? Un pic cam exagerat, dar ziceam și eu.

Comentarii

  • De fapt, are dreptate. Folosirea unei „perioade de inactivitate” adecvate de, să zicem, 3 luni și apoi reîmprospătarea cookie-ului cu această perioadă la fiecare solicitare are sens. –  > Por Stijn de Witt.
  • @StijndeWitt Sau doar 10 ani. Apoi actualizați-l dacă utilizatorul vizitează în următorii 10 ani… –  > Por Jez.
h3r2on

Deși acest lucru nu este chiar posibil, ați putea face ceva similar cu ceea ce face Google și să setați cookie-ul să expire la 17 ianuarie 2038 sau ceva la fel de îndepărtat.

Din punct de vedere practic, ar fi mai bine să vă setați cookie-ul pentru 10 ani sau 60*60*24*365*10, ceea ce ar trebui să supraviețuiască majorității mașinilor pe care va trăi cookie-ul dvs.

Comentarii

  • Acest lucru va funcționa până la începutul anului 2028, moment în care veți depăși valoarea și cookie-urile vor înceta să mai funcționeze. Mai bine folosiți o valoare absolută. –  > Por davidjbullock.
  • Presupunând că în 2028 codul său va mai funcționa pe mașini învechite… Cumva, sunt mai îngrijorat că toată lumea va uita să actualizeze data fixă… Software-ul tinde să trăiască mai mult decât hardware-ul. –  > Por Stijn de Witt.
Björn

Dacă doriți să păstrați permanent datele pe computerul clientului – sau cel puțin până când memoria cache a browserului este golită complet, utilizați memoria locală Javascript:

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

Nu folosiți memoria de sesiune, deoarece va fi ștearsă la fel ca un cookie cu o vârstă maximă de Zero.

Comentarii

  • Nu luați în considerare localStorage atunci când este vorba de citirea datelor de pe server. –  > Por WhiteHorse.
Pedro Lobito

Niciodată și pentru totdeauna sunt două cuvinte pe care evit să le folosesc din cauza imprevizibilității vieții.

Cea mai recentă dată de când 1 January 1970 care poate fi stocat cu ajutorul unui fișier semnat 32-bit întreg semnat este 03:14:07 on Tuesday, 19 January 2038 (231-1 = 2,147,483,647 secunde după 1 January 1970). Această limitare este cunoscută sub denumirea de Problema anului 2038

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

Joel Kennedy

Cred că nu există o modalitate de a face ca un cookie să dureze la nesfârșit, ci trebuie doar să îl setați să expire într-un viitor îndepărtat, cum ar fi anul 2100.

Sarfraz

Nu ar trebui să faceți asta și oricum nu este posibil, Dacă doriți, puteți seta o valoare mai mare, cum ar fi 10 ani înainte.

Apropo, nu am văzut niciodată un cookie cu o astfel de cerință 🙂

Comentarii

  • Presupun că cookie-urile pentru sondajele cu răspuns unic care nu vor să se obosească prea mult cu prevenirea intrărilor multiple au această cerință. –  > Por Elefant aleatoriu.
  • uite @sarfraz e vorba de cookie-ul de calculator nu de cele pe care le mănânci. –  > Por webs.
paulgavrikov

Nu sunt sigur, dar cookie-urile nu sunt șterse la închiderea browserului? Am făcut cumva un cookie care nu expiră niciodată și chrome a recunoscut data de expirare ca fiind „la închiderea browserului” …

Comentarii

  • Nu neapărat, dacă setați o dată de expirare pe cookie, acesta va supraviețui după ce închideți browserul și îl redeschideți. Dacă nu setați o dată de expirare, comportamentul implicit va fi acela de a fi șters atunci când închideți browserul. –  > Por HoLyVieR.
Boris Delormas

Nu se poate, dar ce se întâmplă dacă setați timpul de expirare la acum + 100 de ani ?

Comentarii

  • Nu, pentru că astfel s-ar depăși valoarea maximă din ianuarie 2038. –  > Por davidjbullock.