Tetapkan cookie agar tidak pernah kedaluwarsa

187

Melihat dokumentasi php tentang pengaturan cookie, saya melihat bahwa saya dapat menetapkan tanggal kedaluwarsa untuk cookie tersebut. Anda dapat mengatur cookie agar kedaluwarsa pada akhir sesi browser atau beberapa waktu di masa mendatang tetapi saya tidak melihat cara untuk mengatur cookie agar tidak pernah kedaluwarsa. Apakah ini bahkan mungkin dan bagaimana ini dicapai?

brainimus
sumber
13
@sAc: Mengapa ini hal yang buruk?
brainimus
1
Karena itu tetap tidak mungkin sesuai dengan spesifikasi cookie. Tidak dapat diatur untuk tidak pernah kedaluwarsa.
Sarfraz
2
Anda dapat menggunakan $cookie->setMaxAge(2147483647);, yang lebih dari 2080 dan bekerja pada 32-bit dan 64-bit, dengan github.com/delight-im/PHP-Cookie
gak

Jawaban:

260

Semua cookie kedaluwarsa sesuai spesifikasi cookie , jadi ini bukan batasan PHP.

Gunakan tanggal yang jauh di masa depan. Misalnya, tetapkan cookie yang kedaluwarsa dalam sepuluh tahun:

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

Perhatikan bahwa jika Anda menetapkan tanggal melewati 2038 dalam PHP 32-bit, nomor tersebut akan membungkus dan Anda akan mendapatkan cookie yang kedaluwarsa secara instan.

Joeri Hendrickx
sumber
8
Sepakat! Dan saya pikir, bahwa dalam 20 tahun, situs web akan jauh di depan, bahwa mungkin tidak ada cookie yang akan digunakan.
Sentakan
13
Berhati-hatilah ketika 2018 muncul, jika kita tidak menggunakan PHP 64-bit, ini akan membungkus integer 32-bit dan dikirim ke klien dalam waktu mendekati nol. (Ini terjadi sekarang untuk cookie 25 tahun di PHP.)
Riking
83
Akan lucu untuk kembali ke komentar ini pada tahun 2018 (hanya 5 tahun lagi sekarang) dan melihat semua orang berjuang untuk mengimplementasikan peningkatan Y2018 lalu 20 tahun kemudian pada tahun 2038. Semoga kita semua membuat lompatan ke 64-bit semuanya saat ini tidak akan menjadi masalah selama 292 miliar tahun lagi pada hari Minggu, 4 Desember 292.277.026.596. Kecuali kita mencapai singularitas sebelum mati, saya tidak berpikir saya harus khawatir tentang itu.
shaunhusain
58
Jika seseorang menggunakan komputer yang sama pada akhir 2037 yang mereka gunakan sekarang ... itu hanya akan menyedihkan!
Abela
23
Saya membaca ini pada tahun 2018, panik sejenak, kemudian menyadari bahwa saya baik-baik saja.
The Interloper
80

Nilai maksimum: 2147483647

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

Untuk menghindari integer overflow, timestamp harus diatur ke:

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

Menetapkan nilai yang lebih tinggi dapat menyebabkan masalah dengan browser lama.

Lihat juga RFC tentang 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.

dan RFC 2616, 14,6 Usia :

Jika cache menerima nilai yang lebih besar dari bilangan bulat positif terbesar yang dapat diwakilinya, atau jika salah satu perhitungan usianya meluap, ia HARUS mengirimkan header Usia dengan nilai 2147483648 (2 ^ 31).

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

PiNumber
sumber
39

Tetapkan waktu absolut yang jauh di masa depan :

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

Lebih baik menggunakan waktu absolut daripada menghitungnya relatif terhadap saat ini seperti yang direkomendasikan dalam jawaban yang diterima.

Nilai maksimum yang kompatibel dengan sistem 32 bit adalah:

2147483647 = 2^31 = ~year 2038
David
sumber
23
2 milyar mudah untuk diingat tetapi angka ideal untuk $ selamanya adalah 2 ^ 31 - 1 = 2147483647 sesuai dengan Januari 2038. Ini adalah nilai maksimum untuk menghindari kelebihan integer bug 2038 seperti yang dikatakan @John.
David
13

Hak istimewa saya mencegah saya membuat komentar pada posting pertama sehingga harus pergi ke sini.

Pertimbangan harus diperhitungkan 2038 bug unix ketika menetapkan 20 tahun sebelumnya dari tanggal saat ini yang disarankan sebagai jawaban yang benar di atas.

Cookie Anda pada 19 Januari 2018 + (20 tahun) dapat mencapai masalah 2038 tergantung pada browser dan atau versi yang akhirnya Anda jalankan.

John
sumber
7

Tidak bisakah Anda mengatakan lingkaran yang tidak pernah berakhir, cookie kedaluwarsa sebagai tanggal saat ini + 1 sehingga tidak pernah mengenai tanggal yang seharusnya berakhir karena cookie selalu besok? Sedikit berlebihan tetapi hanya mengatakan.

Yesus
sumber
1
Sebenarnya, dia ada benarnya. Hanya menggunakan beberapa 'periode tidak aktif' yang sesuai, katakanlah, 3 bulan dan kemudian menyegarkan cookie dengan periode itu pada setiap permintaan memang masuk akal.
Stijn de Witt
@StijndeWitt Atau hanya 10 tahun. Kemudian perbarui jika pengguna mengunjungi dalam 10 tahun ...
Jez
5

Meskipun itu tidak mungkin dilakukan, Anda dapat melakukan sesuatu yang mirip dengan yang dilakukan Google dan mengatur cookie agar kedaluwarsa pada 17 Januari 2038 atau sesuatu yang sama jauhnya.

Dalam semua kepraktisan Anda mungkin lebih baik mengatur cookie Anda selama 10 tahun atau 60 * 60 * 24 * 365 * 10, yang seharusnya hidup lebih lama dari sebagian besar mesin cookie Anda akan hidup.

h3r2on
sumber
2
Itu akan bekerja sampai awal 2028, pada titik mana Anda akan melimpah nilainya dan cookie akan berhenti bekerja. Lebih baik menggunakan nilai absolut saja.
davidjbullock
1
Dengan asumsi kode-nya masih akan berjalan pada mesin yang sudah ketinggalan zaman pada tahun 2028 ... Entah bagaimana saya lebih khawatir bahwa semua orang akan lupa untuk memperbarui tanggal tetap ... Perangkat lunak cenderung hidup lebih lama dari perangkat keras.
Stijn de Witt
4

Jika Anda ingin mempertahankan data pada mesin klien secara permanen -atau setidaknya sampai cache browser dikosongkan sepenuhnya, gunakan penyimpanan lokal Javascript:

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

Jangan gunakan penyimpanan sesi, karena akan dihapus seperti cookie dengan usia maksimum Nol.

Björn
sumber
Tidak dapat mempertimbangkan penyimpanan lokal saat membaca data sisi server.
WhiteHorse
1

Tidak pernah dan selamanya adalah dua kata yang saya hindari menggunakan karena ketidakpastian kehidupan.

Waktu terakhir sejak 1 January 1970itu dapat disimpan menggunakan 32-bitbilangan bulat yang ditandatangani adalah 03:14:07 on Tuesday, 19 January 2038( 231-1 = 2,147,483,647detik setelah 1 January 1970) . Batasan ini dikenal sebagai masalah Tahun 2038

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

Saya percaya bahwa tidak ada cara untuk membuat cookie bertahan selamanya, tetapi Anda hanya perlu mengaturnya agar kedaluwarsa jauh di masa depan, seperti tahun 2100.

Joel Kennedy
sumber
0

Anda seharusnya tidak melakukan itu dan itu tidak mungkin, Jika Anda mau, Anda dapat menetapkan nilai yang lebih besar seperti 10 tahun ke depan.

Omong-omong, saya belum pernah melihat cookie dengan persyaratan seperti itu :)

Sarfraz
sumber
Saya akan menganggap cookie untuk jajak pendapat unik yang tidak ingin terlalu repot mencegah beberapa entri memiliki persyaratan ini.
Random Elephant
lihat @ sharfraz dengan cookie komputer bukan yang Anda makan.
web
-1

Saya tidak yakin tetapi apakah cookie tidak dihapus saat browser tutup? Saya entah bagaimana melakukan cookie yang tidak pernah kedaluwarsa dan tanggal yang dikenal krom diakui sebagai "saat browser tutup" ...

bluewhile
sumber
4
Belum tentu, jika Anda menetapkan tanggal kedaluwarsa pada cookie, cookie akan tetap bertahan setelah Anda menutup browser dan membukanya kembali. Jika Anda tidak menetapkan kedaluwarsa, perilaku default akan dihapus ketika Anda menutup browser Anda.
HoLyVieR
-2

Anda tidak bisa tidak bagaimana jika Anda menetapkan waktu kadaluarsa sekarang + 100 tahun?

Boris Delormas
sumber
3
Tidak, karena itu akan melebihi nilai maksimum pada Januari 2038.
davidjbullock