Bagaimana cara me-restart Apache tanpa mereset sesi pengguna?


8

Pengguna masuk ke situs web PHP> Saya me-restart Apache> Pengguna harus masuk lagi.

Bagaimana cara mencegahnya? (Saya tidak ingin pengguna harus masuk lagi)


Untuk memeriksa: Anda memiliki kemampuan untuk mengedit PHP, bukan?
Peter Taylor

Jika itu adalah aplikasi Anda sendiri, saya akan menyarankan apa yang telah disarankan oleh @Jacob Hume di bawah ini dan ubah aplikasi Anda untuk menyimpan sesi dalam tabel database. Ini memberi Anda lebih banyak kontrol dalam pendapat saya atas situs Anda karena Anda dapat memaksa pengguna untuk keluar jika diperlukan secara selektif.
Anagio

Saya bisa mengedit PHP. Saya menggunakan CMS (Drupal). Saya juga menggunakan APC dan sedang mencari solusi dengan cara ini.
dowik

Jawaban:


6

Menyimpan token sesi di lokasi alternatif sebagai cadangan akan mencegah masalah ini. Anda masih bisa menyimpan informasi utama Anda $_SESSION, tetapi tetap menyimpan token cadangan di:

  • Kue
  • Catatan basis data
  • Penyimpanan Lokal HTML5

Anda mungkin menemukan bantuan dalam pertanyaan StackOverflow ini: praktik terbaik untuk waktu tunggu sesi dan login persisten di php .


Terima kasih atas jawabannya dan terima kasih tautannya. Saya sedang mencari solusi pada file konfigurasi sisi server (semacam "menjaga sesi di restart"). Tapi sepertinya solusinya ada di sisi aplikasi.
dowik

Ya ampun ... Sebenarnya aku hanya mencari "apache2ctl -k anggun"!
dowik

3

Data sesi Anda tidak boleh hilang hanya karena Apache dimatikan atau dihidupkan ulang kecuali data sesi disimpan dalam memori dan tidak dicadangkan ke disk (baik oleh sistem file atau database). Jika tidak, Anda dapat me-restart seluruh server dan sesi masih akan tetap ada. Data sesi dirancang untuk disimpan jangka panjang. Satu-satunya waktu sesi hilang adalah jika:

  1. SID hilang. Data sesi masih ada di sisi server, tetapi klien tidak dapat memulihkan SID, jadi tidak dapat memulai kembali sesi yang sama. Ini dapat terjadi jika cookie SID berakhir (jika itu cookie) atau tautan sesi hilang (jika SID adalah parameter URL) atau SID tidak disetel pada sisi-server atau diubah tanpa memberi tahu klien.

  2. Data sesi dihapus di sisi server. Ini biasanya terjadi ketika Pengumpul Sampah Sesi PHP berjalan dan melihat file sesi lebih lama dari session.gc_maxlifetime (yang 24 menit secara default). Kalau tidak, itu bisa terjadi jika aplikasi secara eksplisit menghapus sesi . Pada beberapa server, administrator mungkin juga mengonfigurasi cronjob untuk membersihkan data sesi lama secara teratur.


Terima kasih atas detailnya. Saya akan menyelidiki dengan cara ini. Tapi sekarang, saya hanya akan menggunakan restart anggun yang tampaknya sesuai dengan kebutuhan saya.
dowik

@owik: Bagaimana memulai ulang dengan anggun sesuai kebutuhan Anda? Apakah masalah Anda hilang sesi atau unduhan terputus? Jika yang terakhir, maka restart / shutdown anggun memang akan menyelesaikannya. Tetapi kemudian Anda harus mengedit pertanyaan Anda untuk mencerminkan hal itu. Karena restart yang anggun tidak ada hubungannya dengan sesi PHP, dan itu tidak akan membantu pengguna lain yang mencoba untuk mencegah sesi hilang.
Lèse majesté

Saya telah mencoba memperbarui judul pertanyaan saya dengan mengganti "sesi PHP" dengan "sesi pengguna" seperti yang dijelaskan dalam isi pertanyaan saya. Lebih baik untukmu? Untuk lebih tepatnya: Saya menggunakan APC. Ketika saya mengubah kode dalam file PHP, saya perlu membersihkan APC cache (restart Apache adalah cara paling sederhana untuk melakukannya, saya tahu). Dengan argumen "mulai ulang", pengguna situs web saya perlu masuk lagi. Sementara dengan "anggun", mereka tidak. Itu sebabnya "itu sepertinya sesuai dengan kebutuhan saya".
dowik

@owik: Saya tidak berpikir itu ada hubungannya dengan restart anggun. Anda kemungkinan besar baru saja memulai ulang yang bertepatan dengan pemulung sampah sesi PHP. Login lagi dan coba restart secara teratur segera setelahnya. Kecuali jika Anda menyimpan sesi dalam memori (MM), sesi akan disimpan.
Lèse majesté

1

Dimungkinkan dengan menggunakan argumen yang tepat dengan Apache:

apache2ctl -k graceful

Apache akan memulai ulang tanpa kehilangan sesi saat ini.


2
Restart dengan anggun, hanya menunda penutupan hingga koneksi saat ini diakhiri. Itu tidak mengubah perilaku restart.
Lèse majesté
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.