Apa cara terbaik dan teraman untuk menangani sesi PHP. Apakah cara terbaik untuk menyimpan sesi di:
Basis data (lebih dapat diandalkan, tetapi bottleneck tinggi, kecepatan lambat, tidak bagus untuk situs web penggunaan basis data tinggi)?
Memcache (super cepat, tetapi mendistribusikan lebih banyak masalah keamanan, kemungkinan kehilangan data saat server dimulai ulang dan kemungkinan kehilangan data saat cache penuh)?
File (opsi default, saya kira lambat karena membaca dan menulis dari file I / O, keamanan kurang, dll).
Metode mana yang terbaik? Apa masalah dan hal-hal baik dari masing-masing pendekatan itu?
Jawaban:
Yang terbaik adalah menyimpan di Memcached karena kami dapat dengan mudah menyelesaikan masalah lain (ukuran cache, keamanan, dll.)
Bagaimana cara mengatasi masalah lainnya?
sumber
Untuk sebagian besar aplikasi sehari-hari, menyimpan sesi dalam basis data baik-baik saja. Volume & tingkat konkurensi yang dapat ditangani oleh server sql akan lebih dari cukup. Kuncinya adalah untuk menjaga setiap entri dalam ukuran kecil dan membersihkan baris yang tidak dibutuhkan dengan teratur. Dan pengindeksan yang tepat, tentu saja.
Sistem file - Saya belum pernah melihat perlunya melakukan itu. Saya lebih suka kesederhanaan mengelola baris dalam tabel daripada ribuan file kecil. Ditambah lagi, Anda tidak dapat meminta seluruh file jika Anda ingin menggali statistik sesi.
Perlu diingat, dengan PHP, mudah untuk menukar penangan sesi. Jadi Anda bisa mulai dengan satu format penyimpanan, dan bermigrasi ke format lain tanpa terlalu banyak kesulitan.
sumber
Bagaimana dengan menggunakan mesin penyimpanan MEMORY di MySQL?
Ini tidak secepat Memcache tetapi memiliki keuntungan bahwa Anda dapat menggunakan SQL biasa, dan Anda juga dapat menggunakan mesin penyimpanan normal ketika tidak akan diperlukan dan beralih ke MEMORY ketika jumlah pengguna / permintaan bertambah.
Saya menggunakannya untuk menyimpan data statistik dalam jumlah besar di aplikasi web yang sering berubah sehingga tidak digunakan untuk menangani sesi, tetapi saya pikir itu harus cocok untuk tujuan ini.
sumber
Posting blog ini menunjukkan hasil perbandingan kinerja mesin penyimpanan sesi yang berbeda dengan Magento dan mereka tampaknya menyimpulkan bahwa sekitar 75 pengguna bersamaan tidak benar-benar ada perbedaan kinerja di antara mereka.
Saya berpikir bahwa pada level ini (mereka memiliki sekitar 5 transaksi per detik, yang akan menjadi sekitar 430k hit selama periode 12 jam) overhead dalam segala hal yang lain mendominasi angka kinerja yang Anda lihat sejak file / DB / Memcache / Redis semuanya akan dengan senang hati menangani lalu lintas tanpa berkeringat jika digunakan dengan benar.
Itu meninggalkan faktor-faktor lain seperti skalabilitas, keandalan, dan keamanan.
Pertama-tama saya ingin mengatakan bahwa apa pun yang membahayakan penyimpanan file Anda juga kemungkinan besar akan mengkompromikan hal lain karena penyerang kemudian hanya dapat mengubah kode aplikasi Anda atau paling tidak menemukan kunci dan protokol akses penyimpanan / kredensial bahkan jika mereka hanya baca-saja mengakses. Penyimpanan file akan berfungsi dengan baik untuk situs volume rendah, mudah diatur dan mudah dipikirkan. Seperti yang Anda katakan Anda menekan disk, membaca DB juga akan memukul disk dan jika DB bisa men-cache itu, OS Anda juga kemungkinan telah cache file sesi. Juga, satu file yang dibaca, dan sistem file Anda brilian untuk sampai ke sana jika Anda sudah tahu namanya. Jika Anda menggunakan PHP, tahukah Anda berapa banyak file yang dibaca yang harus dilakukan sistem hanya untuk melayani aplikasi Anda? The downside adalah bahwa Anda bisa '
Memcache relatif cepat dan jika Anda mempertimbangkan solusi kelas Memcache secara lebih luas (Redis, dll) ada beberapa yang bahkan akan menjanjikan kegigihan dalam memori yang dibaca untuk kecepatan sehingga Anda mendapatkan yang terbaik dari kedua dunia. Mereka juga relatif mudah untuk dipikirkan dan nilai kunci dari sesi adalah apa yang telah dirancang untuk dilakukan. Apakah Anda tahu berapa banyak yang harus Anda masukkan ke dalam satu sesi untuk mengisi salah satunya? Bagaimanapun, semua pilihan Anda akan memaksa Anda untuk berkompromi jika Anda mencapai kapasitasnya. Disk diisi dengan file (jumlah dan faktor ukuran di sini), penyimpanan cache mengisi kapasitas dan database memiliki jumlah baris terbatas dan batas kapasitas disk yang sama dengan pendekatan file. Juga, sistem ini hanya didistribusikan jika Anda menjalankannya secara terdistribusi. Sebagian besar bekerja dengan baik dengan pengaturan server tunggal. Jika Anda mendistribusikannya maka Anda mungkin sudah memiliki server web terdistribusi / server database dll sehingga masalah sistem terdistribusi Anda tentu tidak akan muncul dari pilihan penyimpanan sesi Anda. Namun, ketika Anda ingin 10x traffic / kapasitas dll, mendapatkan ada jauh lebih alami dengan ini daripada dengan skema penyimpanan file. Beberapa toko kunci / nilai juga akan memungkinkan Anda untuk melakukan analisis sederhana dari data sesi relatif mudah tetapi kebanyakan tidak akan membuat Anda mendekati apa yang bisa dilakukan SQL.
Saya tidak yakin mengapa Anda mengusulkan bahwa database mungkin lebih dapat diandalkan daripada opsi lain, tetapi saya mendapatkan daya tarik dari database karena aplikasi PHP Anda mungkin sudah memanfaatkannya. Ini berarti Anda tidak menambahkan ketergantungan server lain dan Anda mungkin dapat menggunakan kembali koneksi yang sama yang Anda gunakan untuk mengambil data sesi untuk mendapatkan data pengguna sehingga Anda tidak perlu membuat satu untuk data, satu untuk Memcache, dll. Jika Anda mengindeks tabel dengan baik, itu juga akan melakukan cukup cepat dan memberikan semantik yang cukup sederhana Anda sudah terbiasa dengan menuai sesi lama atau bahkan menganalisis data sesi (saya tidak yakin mengapa Anda ingin dan jika Anda tidak baik, ini mungkin tidak ' sangat penting). Scaling ke skala besar tidak sepele seperti dengan sesuatu seperti Redis,
Saya pikir pilihan ini tidak begitu penting di awal. Setiap pendekatan memiliki tantangan dan kelebihan serta hal-hal yang harus Anda pikirkan. Secara umum, Anda mungkin bisa lolos hanya dengan menggunakan default PHP / kerangka apa pun yang Anda gunakan atau bahkan hanya hal termudah untuk melanjutkan. Jika pilihannya ternyata buruk nantinya, analisis kinerja Anda akan memberi tahu Anda dan Anda akan dipersenjatai dengan data yang Anda butuhkan untuk membuat pilihan yang tepat mengingat sifat spesifik dari lalu lintas yang Anda dapatkan. Di depan, yang dapat Anda miliki adalah spekulasi umum.
sumber
Semua tergantung dari kebutuhan Anda.
Ada beberapa perbedaan antara file dan penyimpanan basis data. Lihat pertanyaan ini .
Namun, Anda dapat melakukan apa yang dilakukan di Rails 3 secara default, dan hanya menggunakan cookie terenkripsi untuk sesi Anda. Jadi, Anda mengenkripsi semua nilai dengan cara yang hanya Anda yang dapat mendekripsinya nanti (mis. Kunci privat / publik), dan Anda membiarkan klien melakukan keadaan yang menjaga Anda.
Di satu sisi itu membatasi Anda untuk 4Kb, yang sebenarnya biasanya cukup (karena Anda biasanya ingin menyimpan ID, bukan seluruh objek), tetapi manfaat yang sangat bagus yang Anda dapatkan adalah bahwa Anda tidak perlu khawatir tentang pembersihan sesi. Anda menyerahkannya kepada klien, di mana seharusnya .
sumber
Untuk situasi khusus saya, saya dapat memberi tahu Anda bahwa sesi dalam basis data adalah penyebab nomor satu server kami hang-up dengan margin yang baik. tabel sesi kami cukup sering rusak sehingga kami harus memangkasnya terlebih dahulu.
memcache terdengar menarik, tetapi kami memiliki terlalu banyak proses yang menghapus seluruh memcache, sehingga sesi pengguna akan terputus terlalu sering. dan sesi yang lebih lama akan dihapus saat memori menjadi penuh ... jadi tidak ada lagi login permanen.
Kami akan segera mencoba sesi berbasis file default.
Jika Anda khawatir tentang keamanan data sesi Anda, maka Anda tidak harus memasukkan data itu di sesi - dan jangan percayai sesi - memvalidasi pengguna pada setiap permintaan.
sumber
Anda dapat mencoba menyimpan sesi Anda di Redis . Redis cepat seperti Memcached tetapi juga memiliki beberapa opsi data-persistence. Selain itu, berbagai klien PHP didukung.
Selain itu, Anda dapat mencoba layanan pihak ketiga seperti Cloud Memcached yang memiliki kemampuan mesin replikasi dan penyimpanan bawaan
Pengungkapan, Saya adalah Pendiri Bersama dan CTO Data Garantia.
sumber