Saya ingin memperpanjang batas waktu sesi di php
Saya tahu mungkin untuk melakukannya dengan memodifikasi file php.ini. Tetapi saya tidak memiliki akses ke sana.
Jadi mungkinkah melakukannya hanya dengan kode php?
Saya ingin memperpanjang batas waktu sesi di php
Saya tahu mungkin untuk melakukannya dengan memodifikasi file php.ini. Tetapi saya tidak memiliki akses ke sana.
Jadi mungkinkah melakukannya hanya dengan kode php?
Jawaban:
Batas waktu sesi adalah gagasan yang harus diterapkan dalam kode jika Anda menginginkan jaminan ketat; itulah satu-satunya cara Anda dapat benar-benar yakin bahwa tidak ada sesi yang akan bertahan setelah X menit tidak aktif.
Jika melonggarkan persyaratan ini sedikit dapat diterima dan Anda baik-baik saja dengan menempatkan batas bawah alih-alih batas waktu yang ketat, Anda dapat melakukannya dengan mudah dan tanpa menulis logika khusus.
Kenyamanan dalam lingkungan yang santai: bagaimana dan mengapa
Jika sesi Anda diimplementasikan dengan cookie (yang mungkin), dan jika klien tidak berbahaya, Anda dapat menetapkan batas atas pada durasi sesi dengan mengubah parameter tertentu. Jika Anda menggunakan standar sesi penanganan PHP dengan cookie, pengaturan
session.gc_maxlifetime
bersama dengansession_set_cookie_params
harus bekerja untuk Anda seperti ini:Ini berfungsi dengan mengonfigurasi server agar data sesi tetap ada selama setidaknya satu jam tidak aktif dan memberi tahu klien Anda bahwa mereka harus "lupa" id sesi mereka setelah rentang waktu yang sama. Kedua langkah ini diperlukan untuk mencapai hasil yang diharapkan.
Jika Anda tidak memberi tahu klien untuk melupakan id sesi mereka setelah satu jam (atau jika klien berbahaya dan memilih untuk mengabaikan instruksi Anda) mereka akan tetap menggunakan id sesi yang sama dan durasi efektifnya akan menjadi non-deterministik. Itu karena sesi yang masa hidupnya telah berakhir pada sisi server tidak segera dikumpulkan sampah tetapi hanya setiap kali sesi GC dimulai .
GC adalah proses yang berpotensi mahal, jadi biasanya probabilitasnya agak kecil atau bahkan nol (situs web yang mendapatkan jumlah besar hit mungkin akan melupakan GC probabilistik sepenuhnya dan menjadwalkannya terjadi di latar belakang setiap X menit). Dalam kedua kasus (dengan asumsi klien yang tidak bekerja sama) batas bawah untuk masa pakai sesi yang efektif adalah
session.gc_maxlifetime
, tetapi batas atas tidak dapat diprediksi.Jika Anda tidak menetapkan
session.gc_maxlifetime
rentang waktu yang sama maka server mungkin membuang data sesi siaga lebih awal dari itu; dalam hal ini, klien yang masih mengingat id sesi mereka akan menyajikannya tetapi server tidak akan menemukan data yang terkait dengan sesi itu, berperilaku efektif seolah-olah sesi baru saja dimulai.Kepastian dalam lingkungan kritis
Anda dapat membuat segala sesuatu sepenuhnya dapat dikontrol dengan menggunakan logika khusus untuk juga menempatkan batas atas pada tidak aktif sesi; bersama dengan batas bawah dari atas ini menghasilkan pengaturan yang ketat.
Lakukan ini dengan menyimpan batas atas bersama dengan sisa data sesi:
Sesi id kegigihan
Sejauh ini kami sama sekali tidak peduli dengan nilai yang tepat dari setiap sesi id, hanya dengan persyaratan bahwa data harus ada selama kami membutuhkannya. Sadarilah bahwa dalam kasus (tidak mungkin) bahwa id sesi penting bagi Anda, harus ada perhatian untuk memperbaharui mereka
session_regenerate_id
ketika diperlukan.sumber
session_start()
juga (jika tidak ada efek sama sekali) dan hanya jika Anda selalu memanggil keduanya sebelumnyasession_start
(jika tidakgc_maxlifetime
memiliki potensi untuk mempengaruhi semua sesi saat ini terbuka, sementarasession_set_cookie_params
hanya dapat mempengaruhi sesi baru yang dimulai dengan permintaan saat ini).Jika Anda menggunakan penanganan sesi default PHP, satu-satunya cara untuk secara andal mengubah durasi sesi di semua platform adalah dengan mengubah php.ini . Itu karena di beberapa platform, pengumpulan sampah diimplementasikan melalui skrip yang berjalan setiap waktu tertentu ( skrip cron ) yang dibaca langsung dari php.ini , dan oleh karena itu segala upaya untuk mengubahnya pada waktu berjalan, misalnya melalui
ini_set()
, tidak dapat diandalkan dan kemungkinan besar tidak akan bekerjaMisalnya, dalam sistem Debian Linux, pengumpulan sampah internal PHP dinonaktifkan dengan pengaturan
session.gc_probability=0
secara default dalam konfigurasi, dan sebaliknya dilakukan melalui /etc/cron.d/php, yang berjalan di XX: 09 dan XX: 39 (yaitu, setiap setengah jam). Pekerjaan cron ini mencari sesi yang lebih lama dari session.gc_maxlifetime yang ditentukan dalam konfigurasi, dan jika ada yang ditemukan, mereka dihapus. Akibatnya, dalam sistemini_set('session.gc_maxlifetime', ...)
ini diabaikan. Itu juga menjelaskan mengapa dalam pertanyaan ini: sesi PHP terlalu cepat , OP memiliki masalah dalam satu host tetapi masalah berhenti ketika beralih ke host yang berbeda.Jadi, mengingat Anda tidak memiliki akses ke php.ini , jika Anda ingin melakukannya dengan mudah, menggunakan penanganan sesi default bukanlah suatu pilihan. Tampaknya, memperpanjang umur cookie sudah cukup untuk host Anda, tetapi jika Anda menginginkan solusi yang dapat diandalkan bahkan jika Anda mengganti host, Anda harus menggunakan alternatif lain.
Metode alternatif yang tersedia meliputi:
Tetapkan penangan sesi (simpan) yang berbeda di PHP untuk menyimpan sesi Anda di direktori yang berbeda atau dalam database, sebagaimana ditentukan dalam PHP: Penangan Sesi Kustom (manual PHP) , sehingga tugas cron tidak mencapainya, dan hanya PHP yang pengumpulan sampah internal berlangsung. Opsi ini mungkin dapat digunakan
ini_set()
untuk mengatur session.gc_maxlifetime tetapi saya lebih suka mengabaikan parameter maxlifetime digc()
callback saya dan menentukan masa pakai maksimum saya sendiri.Lupakan tentang penanganan sesi internal PHP dan laksanakan manajemen sesi Anda sendiri. Metode ini memiliki dua kelemahan utama: Anda akan memerlukan variabel sesi global Anda sendiri, sehingga Anda kehilangan keunggulan
$_SESSION
superglobal, dan itu membutuhkan lebih banyak kode sehingga ada lebih banyak peluang untuk bug dan kelemahan keamanan. Yang paling penting, pengidentifikasi sesi harus dihasilkan dari nomor acak acak atau pseudorandom untuk menghindari prediktabilitas ID sesi (yang mengarah ke kemungkinan pembajakan sesi), dan itu tidak mudah dilakukan dengan PHP dengan mudah. Keuntungan utama adalah ia akan bekerja secara konsisten di semua platform dan Anda memiliki kontrol penuh atas kode. Itu pendekatan yang diambil misalnya oleh perangkat lunak forum phpBB (setidaknya versi 1; Saya tidak yakin tentang versi yang lebih baru).Ada contoh (1) dalam dokumentasi untuk
session_set_save_handler()
. Contohnya panjang tapi saya akan mereproduksi di sini, dengan modifikasi yang relevan diperlukan untuk memperpanjang durasi sesi. Perhatikan dimasukkannyasession_set_cookie_params()
untuk meningkatkan umur cookie juga.Pendekatan (2) lebih rumit; pada dasarnya, Anda harus mengimplementasikan kembali semua fungsi sesi Anda sendiri. Saya tidak akan membahas detailnya di sini.
sumber
php.ini
opsi praktis Anda sangat dibatasi./usr/lib/php5/maxlifetime
tidak akan menghitung nilai di bawah 24 menit. Jadi Anda tidak dapat mengatur batas waktu sesi Anda lebih rendah dari itu.Menambahkan komentar untuk siapa pun yang menggunakan Plesk mengalami masalah dengan hal-hal di atas karena hal itu membuat saya gila, mengatur session.gc_maxlifetime dari skrip PHP Anda tidak akan berfungsi karena Plesk memiliki skrip pengumpulan sampah sendiri yang dijalankan dari cron.
Saya menggunakan solusi yang diposting pada tautan di bawah ini untuk memindahkan pekerjaan cron dari jam ke hari untuk menghindari masalah ini, maka jawaban teratas di atas seharusnya bekerja:
https://websavers.ca/plesk-php-sessions-timing-earlier-expected
sumber
Masukkan
$_SESSION['login_time'] = time();
ke halaman otentikasi sebelumnya. Dan potongan di bawah ini di setiap halaman lain di mana Anda ingin memeriksa batas waktu sesi.Sunting: Ini hanya berfungsi jika Anda sudah menggunakan tweak di posting lain, atau menonaktifkan Pengumpulan Sampah, dan ingin memeriksa durasi sesi secara manual. Jangan lupa untuk menambahkan
die()
setelah pengalihan, karena beberapa skrip / robot mungkin mengabaikannya. Juga, langsung menghancurkan sesi dengansession_destroy()
alih - alih mengandalkan pengalihan untuk itu mungkin menjadi pilihan yang lebih baik, sekali lagi, dalam kasus klien jahat atau robot.sumber
Hanya pemberitahuan untuk server hosting berbagi atau ditambahkan di domain =
Agar pengaturan Anda berfungsi, Anda harus memiliki dir sesi penyimpanan yang berbeda untuk domain yang ditambahkan dengan menggunakan php_value session.save_path "folderA / sessionA".
Jadi buat folder ke server root Anda, jangan ke public_html dan jangan sampai publisitas diakses dari luar. Untuk cpanel / server saya berfungsi dengan baik izin folder 0700. Cobalah ...
kode php =
sebelum session_start ();
atau
.htaccess =
Setelah banyak meneliti dan menguji ini bekerja dengan baik untuk server cpanel / php7 bersama. Banyak terima kasih kepada: NoiS
sumber
Tidak. Jika Anda tidak memiliki akses ke php.ini, Anda tidak dapat menjamin bahwa perubahan akan berdampak apa pun.
Saya ragu Anda perlu memperpanjang waktu sesi Anda.
Ini memiliki batas waktu yang cukup masuk akal saat ini dan tidak ada alasan untuk memperpanjangnya.
sumber
SELECT id FROM gallery WHERE SortOrder > $currentsortorder LIMIT 1
Anda dapat mengganti nilai dalam php.ini dari kode PHP Anda menggunakan
ini_set()
.sumber
session.gc_maxlifetime
bukan pengaturan yang mengontrol masa pakai sesi. Hal ini dapat dipukul dengan pekerjaan seperti itu jika Anda mengatursession.gc_divisor
untuk1
, tapi itu hanya mengerikan.gc_maxlifetime
menetapkan interval setelah data sesi memenuhi syarat untuk pengumpulan sampah - jika GC terjadi setelah waktu yang banyak berlalu, data sesi akan dihancurkan (dengan pengaturan default ini sama dengan berakhirnya sesi). Tetapi GC dipicu secara probabilistik pada setiap awal sesi, jadi tidak ada jaminan sesi akan benar-benar berakhir - Anda dapat merencanakan kurva prob vs waktu, tetapi tidak akan terlihat seperti dinding bata. Itu hanya puncak gunung es; lihat stackoverflow.com/questions/520237/…