Встановіть файл cookie, щоб він ніколи не закінчувався


187

Переглядаючи документацію на php щодо налаштування файлу cookie, я бачу, що я можу встановити термін придатності для файлу cookie. Ви можете встановити термін дії файлу cookie в кінці сеансу браузера або через деякий час у майбутньому, але я не бачу способу встановити печиво, щоб воно ніколи не закінчилось. Це можливо навіть і як це здійснюється?


13
@sAc: Чому це погано?
brainimus

1
Тому що це неможливо все-таки згідно зі специфікацією файлу cookie. Його не можна встановити, щоб він ніколи не закінчувався.
Сарфраз

2
Ви можете використовувати $cookie->setMaxAge(2147483647);, що пізніше 2080 року та працює як на 32-розрядному, так і на 64-розрядному з github.com/delight-im/PHP-Cookie
caw

Відповіді:


259

Усі файли cookie закінчуються відповідно до специфікації cookie , тому це не обмеження PHP.

Використовуйте дальню дату. Наприклад, встановіть файл cookie, який закінчується через десять років:

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

Зауважте, що якщо встановити дату минулого 2038 року в 32-розрядному PHP, це число обернеться, і ви отримаєте файл cookie, який миттєво закінчується.


8
Домовились! І я думаю, що через 20 років веб-сайти будуть набагато попереду, що, можливо, не використовуватимуться файли cookie .. @brainimus: Просто використовуйте стару шкільну систему, яку всі згадали - поточний час + час у далекому майбутньому!
поштовх

13
Будьте уважні, що коли 2018 рік наближається, якщо ми не використовуємо 64-розрядний PHP, він обернеться навколо 32-бітного цілого числа і буде надісланий клієнтові як раз біля нуля. (Це відбувається зараз для 25-річних файлів cookie на PHP.)
Рікінг

83
Буде смішно повернутися до цих коментарів у 2018 році (лише 5 років зараз) і побачити, як усі намагаються здійснити оновлення Y2018, а потім ще 20 років пізніше 2038 року. Сподіваємось, ми всі зробимо перехід на 64-бітне все до цього не буде проблемою ще протягом 292 мільярдів років у неділю, 4 грудня, 292,277,026,596. Якщо ми не досягнемо особливості перед смертю, я не думаю, що мені доведеться турбуватися про це.
shaunhusain

58
Якщо в кінці 2037 року людина користується тим самим комп’ютером, яким вони користуються зараз ... це було б просто сумно!
Абела

22
Я читаю це у 2018 році, на хвилину запанікував, потім зрозумів, що я все в порядку.
Інтерлопер

80

Максимальне значення: 2147483647

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

Щоб уникнути переповнення цілого числа, часову позначку слід встановити таким чином:

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

Встановлення більш високого значення може спричинити проблеми зі старими браузерами.

Також дивіться RFC про файли 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.

та RFC 2616, 14,6 віку :

Якщо кеш отримує значення, яке перевищує найбільше додатне ціле число, яке воно може представляти, або якщо будь-який з його вікових обчислень переповнюється, він ОБОВ'ЯЗКОВО передає заголовку віку зі значенням 2147483648 (2 ^ 31).

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


39

Встановіть далекий майбутній абсолютний час :

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

Краще використовувати абсолютний час, ніж обчислювати його відносно теперішнього, як це рекомендовано у прийнятій відповіді.

Максимальне значення, сумісне з 32-бітовою системою, становить:

2147483647 = 2^31 = ~year 2038

22
2 мільярди легко запам’ятати, але ідеальне число для $ назавжди було б 2 ^ 31 - 1 = 2147483647, що відповідає січня 2038 р. Це максимальне значення, щоб уникнути переповнення цілої помилки 2038 року, як сказав @John.
Девід

13

Моя привілей заважає мені коментувати першу публікацію, тому доведеться йти сюди.

Необхідно враховувати помилку 2038 unix при встановленні 20 років заздалегідь від поточної дати, яка є правильною відповіддю вище.

Ваш файл cookie 19 січня 2018 року + (20 років) цілком може спричинити проблему 2038 залежно від браузера та / або версій, в яких ви працюєте.


7

Ви не можете просто сказати, що нескінченний цикл, термін cookie закінчується як поточна дата + 1, тому він ніколи не потрапляє до дати, на яку він повинен закінчитися, оскільки це завжди завтра? Трохи зайвого, але просто сказаного.


1
Власне, у нього є пункт. Використання певного періоду бездіяльності, скажімо, 3 місяців, а потім оновлення файлу cookie протягом цього запиту має певний сенс.
Штійн де Вітт

@StijndeWitt Або всього 10 років. Потім оновити , якщо відвідувань користувачів в протягом 10 років ...
Jez

5

Хоча це не зовсім можливо, ви можете зробити щось подібне до того, що робить Google, і встановити термін дії вашого файлу cookie на 17 січня 2038 року або щось настільки ж далеко.

З усієї практичності вам може бути краще встановити файл cookie на 10 років або 60 * 60 * 24 * 365 * 10, який повинен пережити більшість машин, на яких cookie буде жити.


2
Це буде працювати до початку 2028 року, після чого ви переповнить значення, і куки перестануть працювати. Краще замість цього використовувати абсолютне значення.
davidjbullock

1
Якщо припустити, що його код все ще буде працювати на застарілих машинах у 2028 році ... Якось я більше переживаю, що всі забудуть оновити встановлену дату ... Програмне забезпечення, як правило, переживає обладнання.
Штійн де Вітт

4

Якщо ви хочете постійно зберігати дані на клієнтській машині або хоча б до повного спорожнення кешу браузера, використовуйте локальне зберігання Javascript:

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

Не використовуйте зберігання сеансу, оскільки воно буде очищено так само, як печиво з максимальним віком нуля.


Не можна вважати localStorage, коли мова йде про читання даних на стороні сервера.
WhiteHorse

1

Ніколи і назавжди це два слова, які я уникаю використовувати через непередбачуваність життя.

Останній час, 1 January 1970який можна зберегти за допомогою підписаного 32-bitцілого числа, - це 03:14:07 on Tuesday, 19 January 2038( 231-1 = 2,147,483,647секунди після 1 January 1970) . Це обмеження відоме як проблема 2038 року

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

0

Я вважаю, що не існує способу зробити так, щоб файл cookie тривав назавжди, але вам потрібно просто встановити його, щоб закінчитися в майбутньому, наприклад, 2100 рік.


0

Ви не повинні цього робити, а це все одно неможливо. Якщо ви хочете, ви можете встановити більше значення, наприклад, на 10 років вперед.

До речі, я ніколи не бачив печива з такою вимогою :)


Я б припустив, що файли cookie для однозначних відповідей на опитування, які не хочуть занадто сильно заважати запобіганням кількох записів, мають цю вимогу.
Випадковий слон

дивіться @sarfraz його комп'ютерне печиво, а не те, що ви їсте.
веб-сайт

-1

Я не впевнений, але чи не видаляються файли cookie при закритті браузера? Я якось зробив файли cookie та хрому, що визнав термін дії "минулим", як "у веб-переглядачі" ...


4
Не обов'язково, якщо ви встановите дату закінчення терміну дії файлу cookie, він збережеться після закриття веб-переглядача та його відкриття. Якщо ви не встановите термін придатності, поведінку за замовчуванням буде видалено, коли ви закриєте веб-переглядач.
HoLyVieR

-2

Ви не можете, але що, якщо встановити термін дії до теперішнього часу + 100 років?


3
Ні, тому що це перевищить максимальне значення в січні 2038 р.
davidjbullock
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.