Defina um cookie para nunca expirar

187

Olhando a documentação do php sobre a configuração de um cookie , vejo que posso definir uma data de validade para o cookie. Você pode definir o cookie para expirar no final da sessão do navegador ou em algum momento no futuro, mas não vejo uma maneira de definir o cookie para nunca expirar. Isso é possível e como isso é realizado?

brainimus
fonte
13
@sAc: Por que isso é uma coisa ruim?
brainimus
1
Porque isso não é possível de qualquer maneira, conforme a especificação do cookie. Não pode ser definido para nunca expirar.
Sarfraz
2
Você pode usar $cookie->setMaxAge(2147483647);, que é mais tarde do que 2080 e funciona tanto em 32-bit e 64-bit, com github.com/delight-im/PHP-Cookie
caw

Respostas:

260

Todos os cookies expiram conforme a especificação de cookies , portanto, isso não é uma limitação do PHP.

Use uma data muito futura. Por exemplo, defina um cookie que expira em dez anos:

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

Observe que, se você definir uma data após 2038 no PHP de 32 bits, o número será contornado e você receberá um cookie que expira instantaneamente.

Joeri Hendrickx
fonte
8
Acordado! E acho que, daqui a 20 anos, os sites estarão muito à frente, que possivelmente nenhum cookie será usado.
sacudida
13
Observe que, quando 2018 chegar, se não estivermos usando PHP de 64 bits, isso envolverá o número inteiro de 32 bits e será enviado ao cliente como um tempo próximo de zero. (Isso está acontecendo agora para cookies 25 anos no PHP.)
Riking
83
Será engraçado voltar a esses comentários em 2018 (daqui a apenas cinco anos) e ver todos se esforçarem para implementar a atualização do Y2018 novamente 20 anos depois em 2038. Esperamos que todos façamos o salto para tudo de 64 bits até então. não será um problema por mais 292 bilhões de anos no domingo, 4 de dezembro, 292.277.026.596. A menos que alcancemos uma singularidade antes de eu morrer, acho que não precisarei me preocupar com isso.
shaunhusain
58
Se uma pessoa estiver usando o mesmo computador no final de 2037 que está usando agora ... isso seria triste!
quer
23
Estou lendo isso em 2018, entrei em pânico por um momento e depois percebi que estava bem.
O Intruso
80

Valor máximo: 2147483647

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

Para evitar excesso de número inteiro, o registro de data e hora deve ser definido como:

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

Definir um valor mais alto pode causar problemas com navegadores mais antigos.

Veja também o RFC sobre 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.

e RFC 2616, 14,6 Idade :

Se um cache recebe um valor maior que o maior número inteiro positivo que pode representar, ou se algum de seus cálculos de idade estourar, DEVE transmitir um cabeçalho de Idade com um valor de 2147483648 (2 ^ 31).

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

PiTheNumber
fonte
39

Defina um tempo absoluto futuro distante :

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

É melhor usar um tempo absoluto do que calculá-lo em relação ao presente, conforme recomendado na resposta aceita.

O valor máximo compatível com sistemas de 32 bits é:

2147483647 = 2^31 = ~year 2038
David
fonte
23
É fácil lembrar de 2 bilhões, mas o número ideal para $ para sempre seria 2 ^ 31 - 1 = 2147483647 correspondente a janeiro de 2038. É o valor máximo para evitar o estouro inteiro do bug de 2038, como disse @John.
David
13

Meu privilégio me impede de fazer meu comentário no primeiro post, então ele terá que ir aqui.

Deve-se levar em consideração o bug do unix 2038 ao definir 20 anos de antecedência a partir da data atual, sugerida como a resposta correta acima.

Seu cookie em 19 de janeiro de 2018 + (20 anos) pode atingir o problema 2038, dependendo do navegador e / ou versões nas quais você acaba executando.

John
fonte
7

Você não pode simplesmente dizer um loop sem fim, o cookie expira como data atual + 1 para que nunca atinja a data em que deveria expirar porque é sempre amanhã? Um pouco exagerado, mas apenas dizendo.

Jesus
fonte
1
Na verdade, ele tem razão. Usar algum período de inatividade adequado de, digamos, três meses e atualizar o cookie com esse período em cada solicitação faz algum sentido.
Stijn de Witt
@StijndeWitt Ou apenas 10 anos. Em seguida, atualizá-lo se o usuário visitar dentro de 10 anos ...
Jez
5

Embora isso não seja exatamente possível, você pode fazer algo semelhante ao que o Google faz e definir seu cookie para expirar em 17 de janeiro de 2038 ou algo igualmente distante.

Com toda a praticidade, é melhor definir seu cookie por 10 anos ou 60 * 60 * 24 * 365 * 10, o que deve sobreviver à maioria das máquinas em que ele permanecerá.

h3r2on
fonte
2
Isso funcionará até o início de 2028, quando você excederá o valor e os cookies deixarão de funcionar. Melhor usar um valor absoluto.
Davidjbullock
1
Supondo que seu código ainda esteja sendo executado em máquinas desatualizadas em 2028 ... De alguma forma, estou mais preocupado que todos se esqueçam de atualizar a data fixa ... O software tende a sobreviver ao hardware.
Stijn de Witt
4

Se você deseja manter os dados permanentemente na máquina cliente - ou pelo menos até que o cache do navegador seja esvaziado completamente, use o armazenamento local Javascript:

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

Não use armazenamento de sessão, pois ele será limpo como um cookie com idade máxima de zero.

Björn
fonte
Não é possível considerar o localStorage quando se trata de ler dados do servidor.
WhiteHorse 03/04
1

Nunca e para sempre são duas palavras que eu evito usar devido à imprevisibilidade da vida.

O tempo mais recente desde 1 January 1970que pode ser armazenado usando um 32-bitnúmero inteiro assinado é 03:14:07 on Tuesday, 19 January 2038( 231-1 = 2,147,483,647segundos depois 1 January 1970) . Essa limitação é conhecida como o problema do ano 2038

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

Acredito que não há uma maneira de fazer um cookie durar para sempre, mas você só precisa configurá-lo para expirar no futuro, como o ano 2100.

Joel Kennedy
fonte
0

Você não deve fazer isso e isso não é possível de qualquer maneira. Se você quiser, pode definir um valor maior, como dez anos à frente.

By the way, eu nunca vi um cookie com esse requisito :)

Sarfraz
fonte
Eu assumiria cookies para pesquisas respondidas exclusivamente que não querem se preocupar muito em impedir que várias entradas tenham esse requisito.
Random Elephant
olha @sarfraz é o cookie do computador e não o que você come.
webs
-1

Não tenho certeza, mas os cookies não são excluídos no fechamento do navegador? De alguma forma, fiz um cookie que nunca expirava e o Chrome reconheceu a data de validade como "ao fechar o navegador" ...

enquanto
fonte
4
Não necessariamente, se você definir uma data de validade no cookie, ele sobreviverá depois que você fechar o navegador e reabri-lo. Se você não definir uma expiração, o comportamento padrão será excluído quando você fechar o navegador.
HoLyVieR
-2

Você não pode, e se definir o tempo de expiração para agora + 100 anos?

Boris Delormas
fonte
3
Não, porque isso iria exceder o valor máximo em janeiro de 2038.
davidjbullock