Cookieを無期限に設定する


187

見てみると、クッキーの設定にPHPのドキュメント私はクッキーの有効期限を設定することができていることがわかります。ブラウザセッションの終了時または将来のある時点でCookieが期限切れになるように設定できますが、Cookieが期限切れにならないように設定する方法がわかりません。これは可能ですか?これはどのように達成されますか?


13
@sAc:なぜこれが悪いのですか?
brainimus

1
とにかく、Cookieの仕様では不可能です。有効期限なしに設定することはできません。
Sarfraz、2010

2
github.com/delight-im/PHP-Cookieを使用して$cookie->setMaxAge(2147483647);、2080以降で32ビットと64ビットの両方で動作するを使用できます
caw

回答:


259

すべてのCookieはCookie仕様に従って有効期限が切れるため、これはPHPの制限ではありません。

はるか未来の日付を使用してください。たとえば、10年で期限切れになるCookieを設定します。

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

32ビットのPHPで2038年を超える日付を設定すると、数値が折り返され、すぐに期限切れになるCookieが取得されることに注意してください。


8
同意しました!そして、私は20年以内にウェブサイトがはるかに先を行くと思います、おそらくCookieは使用されないでしょう。
2010

13
2018年になると、64ビットのPHPを使用していない場合、32ビットの整数がラップされ、ゼロに近い時間としてクライアントに送信されることに注意してください。(これはPHPの25年のクッキーのために、今何が起こっている。)
Riking

83
2018年にこれらのコメントに戻って(今からわずか5年後)、みんながY2018アップグレードを実装するためにスクランブルをかけ、2038年に再び2038年に実装されるのを見るのはおかしいでしょう。 12月4日(日曜日)に2920億年もの間、問題は起こらないでしょう。私が死ぬ前に特異点に達しない限り、それについて心配する必要はないと思います。
shaunhusain 2013年

58
2037年の終わりに、現在使用しているコンピューターと同じコンピューターを使用している場合、それは悲しいことです。
Abela

22
私は2018年にこれを読んでいて、一瞬パニックになって、大丈夫だと気づきました。
侵入者

80

最大値:2147483647

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

整数オーバーフローを回避するには、タイムスタンプを次のように設定する必要があります。

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

高い値を設定すると、古いブラウザーで問題が発生する可能性があります。

Cookieに関するRFCも参照してください。

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
20億は覚えやすいですが、$ foreverの理想的な数は2038年1月に対応する2 ^ 31-1 = 2147483647です。@ Johnが言ったように、これは2038バグの整数オーバーフローを回避するための最大値です。
David

13

私の特権のため、最初の投稿にコメントを付けることができないため、ここに投稿する必要があります。

上記の正解として提案されている現在の日付から20年前に設定する場合、2038のUNIXバグを考慮する必要があります。

2018年1月19日+(20年)のCookieは、ブラウザーや実行しているバージョンによっては、2038の問題によく当たる可能性があります。


7

決して終わることのないループと言えませんか?Cookieは現在の日付+ 1として期限切れになるので、常に明日なので、期限が切れるはずの日付に到達することはありませんか?少しやりすぎですが、言っています。


1
実際、彼はポイントを持っています。たとえば、3か月の適切な「非アクティブ期間」を使用して、リクエストごとにその期間でCookieを更新することには意味があります。
Stijn de Witt

@StijndeWittまたはちょうど10年。その後、ユーザーが10年以内にアクセスした場合は更新します...
Jez

5

それは完全に可能ではありませんが、Googleが行うのと同じようなことをして、Cookieを2038年1月17日または同様にはるかに有効期限が切れるように設定できます。

実際には、Cookieを10年間または60 * 60 * 24 * 365 * 10に設定した方がよい場合があります。これは、Cookieが存在するほとんどのマシンよりも長く存続するはずです。


2
これは2028年の初めまで機能します。その時点で値がオーバーフローし、Cookieが機能しなくなります。代わりに絶対値を使用することをお勧めします。
davidjbullock 2014年

1
彼のコードが2028年になっても古いマシンで実行されていると仮定すると...どういうわけか、誰もが固定日付を更新するのを忘れるのではないかと心配しています...ソフトウェアはハードウェアよりも寿命が長い傾向があります。
Stijn de Witt

4

クライアントマシンのデータを永続的に保持する場合、または少なくともブラウザのキャッシュが完全に空になるまで、JavaScriptローカルストレージを使用します。

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

最大保存期間がゼロのCookieと同じように消去されるため、セッションストレージは使用しないでください。


サーバーサイドデータの読み取りに関しては、localStorageを検討してください。
WhiteHorse

1

決して永遠に私は人生の予測不可能性のために使用しないように、2つの言葉がありません。

1 January 1970符号付き32-bit整数を使用して保存できるようになった以降の最新の時刻は03:14:07 on Tuesday, 19 January 2038231-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を見てください、あなたが食べるものではなく、コンピュータのクッキーです。
Web

-1

よくわかりませんが、ブラウザを閉じるときにCookieは削除されませんか?私はどういうわけか、決して有効期限のないCookieを実行し、Chromeは有効期限を「ブラウザ終了時」として認識しました...


4
必ずしもではありませんが、Cookieに有効期限を設定した場合、ブラウザを閉じて再度開いた後も有効です。有効期限を設定しない場合、ブラウザを閉じるとデフォルトの動作が削除されます。
HoLyVieR 2010年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.