2010-07-20 3 views
143

Глядя на php documentation on setting a cookie Я вижу, что я могу установить дату истечения срока действия для файла cookie. Вы можете установить, что cookie истекает в конце сеанса браузера или в какой-то момент в будущем, но я не вижу способа установить, чтобы cookie никогда не истекал. Возможно ли это и как это достигается?Установите cookie, чтобы никогда не истекать

+0

Вы не должны делать это. – Sarfraz

+11

@sAc: Почему это плохо? – brainimus

+1

Потому что это невозможно в любом случае в соответствии с спецификацией cookie. Он не может быть установлен, чтобы никогда не истекать. – Sarfraz

ответ

202

Всего печенье истекает в соответствии с cookie specification, так что это не PHP ограничения.

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

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

Обратите внимание, что если вы установили дату прошлого в PHP, число будет обернуть вокруг, и вы получите печенье, который истекает мгновенно.

+7

Согласен! И я думаю, что через 20 лет веб-сайты будут далеко впереди, возможно, не будут использоваться файлы cookie. @brainimus: Просто используйте систему oldschool, которую все упомянули, - текущее время + время в далеком будущем! – jolt

+13

Остерегайтесь, что, когда 2018 произойдет, если мы не используем 64-битный PHP, это будет охватывать 32-битное целое число и отправляться клиенту как время около нуля. (Это происходит прямо сейчас для 25-летних файлов cookie на PHP.) – Riking

+0

@ Riking хороший улов. Время мигрировать;) –

0

Я считаю, что это не способ сделать печенье длиться вечно, но вам просто нужно установить его истекает далеко в будущее, такие как год 2100.

0

Вы не можете, но что если вы установите время истечения срока действия до + 100 лет?

+1

Нет, потому что это превысило бы максимальное значение в январе 2038 года. – davidjbullock

0

Вы не должны этого делать, и это невозможно в любом случае. Если вы хотите, вы можете установить большее значение, например, на 10 лет вперед.

Кстати, я никогда не видел печенье с таким требованием :)

6

Хотя это не совсем возможно, вы можете сделать что-то похожее на то, что делает Google, и установить, что ваш файл cookie истекает 17 января 2038 года или что-то в таком же отдалении.

По всей практичности вам может быть лучше настроить ваш печенье на 10 лет или 60 * 60 * 24 * 365 * 10, что должно пережить большинство машин, на которых будет работать ваш печенье.

+1

Это будет работать до начала 2028 года, после чего вы переполните значение, и файлы cookie перестанут работать. Лучше использовать абсолютное значение вместо этого. – davidjbullock

+1

Предполагая, что его код по-прежнему будет работать на устаревших машинах в 2028 году ... Почему-то меня больше беспокоит, что каждый забудет обновить фиксированную дату ... Программное обеспечение имеет тенденцию переживать аппаратное обеспечение. –

-1

Я не уверен, но не куки удалены в браузере закрыть? Я как-то сделал никогда не истекающий cookie и хром признал истекшую дату как «при закрытии браузера» ...

+3

Не обязательно, если вы установите дату истечения срока действия в файле cookie, он сохранится после закрытия браузера и повторного его открытия. Если вы не установите срок действия, поведение по умолчанию будет удалено при закрытии браузера. – HoLyVieR

12

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

Рассмотрение должно приниматься во внимание 2038 unix bug при настройке 20 лет вперед с текущей даты, которая предлагается как правильный ответ выше.

Ваш файл cookie от 19 января 2018 года (20 лет) может поразить проблему 2038 в зависимости от браузера и версий, в которых вы работаете.

24

Установить далеко в будущем абсолютное время:

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

Лучше использовать абсолютное время, чем вычисление его по отношению к настоящему, как это рекомендовано в принятом ответе.

Максимальное значение совместимо с 32 системами битов:

2147483647 = 2^31 = ~year 2033 
+21

2 миллиарда легко запомнить, но идеальное число для $ forever будет 2^31 - 1 = 2147483647, соответствующее январю 2038 года. Это максимальное значение, чтобы избежать целочисленного переполнения ошибки 2038, как сказал @John. – David

4

Разве вы не можете просто сказать, бесконечный цикл, печенье истекает, как текущая дата + 1, так что никогда не попадает на дату как это должно истечь потому что это всегда завтра? Немного переборщил, но просто сказал.

+9

+1 для ответа, подходящего для «Что сделал бы Иисус!» ;) – teodron

+1

Собственно, у него есть точка. Просто используйте подходящий «период бездействия», скажем, 3 месяца, а затем обновление файла cookie с этим периодом по каждому запросу имеет смысл. –

+0

@StijndeWitt Или всего 10 лет. Затем обновите его, если пользователь посещает в течение 10 лет ... – Jez

3

Если вы хотите сохранять данные на клиентской машине постоянно -или, по крайней мере, пока кэш браузера не опорожняется полностью, используйте Javascript локальное хранилище:

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

Не использовать хранения сессии, как это будет очищается точно так же, как cookie с максимальным временем Zero.

55

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

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

Чтобы избежать целочисленного переполнения метка времени должна быть установлена ​​на:

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

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

см Также 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. 

и RFC 2616, 14.6 Age:

Если кэш получает значение больше наибольшего положительного целое оно может представлять, или если какой-либо из его возрастные вычисления переполнения, он ДОЛЖЕН передать заголовок Возраста со значением 21474 83648 (2^31).

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

Смежные вопросы