Saya menjaga toko Magento dengan 400-500 pengunjung dan 40-50 pesanan per hari. Baru-baru ini sistem ditingkatkan dari Magento EE 1.14.2.4 ke Magento EE 1.14.3.2 dan saya melihat beberapa pengecualian aneh dalam log:
exception 'Mage_Core_Model_Session_Exception' in
/var/www/.../app/code/core/Mage/Core/Model/Session/Abstract/Varien.php:418
Saya mengejar pengecualian itu dan saya tahu bahwa itu sedang dipecat karena kode validasi sesi berikut gagal memvalidasi sesi:
class Mage_Core_Model_Session_Abstract_Varien extends Varien_Object
{
// ...
protected function _validate()
{
// ...
if ($this->useValidateSessionExpire()
&& isset($sessionData[self::VALIDATOR_SESSION_EXPIRE_TIMESTAMP])
&& $sessionData[self::VALIDATOR_SESSION_EXPIRE_TIMESTAMP] < time() ) {
Blok if ini ditambahkan ke file dengan rilis terbaru dari Magento. Dan ini sepertinya perubahan pengereman, lihat detail lebih lanjut di bawah ini.
Pengecualian terjadi cukup sering, seperti belasan kali per hari. tapi saya tidak dapat membuat ulang kondisi yang mengarah ke pengecualian, kecuali saya benar-benar mengemukakan kondisi di atas. Pengecualian paling sering terjadi pada halaman detail produk dan pada langkah terakhir dari satu checkout halaman. Toko adalah toko b2b, pengguna harus masuk untuk melihat halaman produk atau dapat checkout, berarti pengguna diarahkan ke halaman login saat sesi tidak valid / kedaluwarsa. Saat ini lebih penting bagi saya untuk memperbaiki masalah ini saat checkout.
Apa yang terjadi dari perspektif pengguna: Pengguna mengisi troli, melanjutkan ke checkout, dan mencapai langkah terakhir, kemudian ia menekan tombol "kirim pesanan" dan tidak ada yang terjadi. Di belakang layar JS Magento melakukan permintaan AJAX dan JS mengharapkan untuk menerima JSON kembali, tetapi jika kesalahan ini terjadi, halaman login HTML dikembalikan, yang tidak dapat diuraikan oleh JavaScript dan hanya tidak melakukan apa-apa. Itu sangat membingungkan bagi pengguna.
Ya, itu bukan skenario pengguna yang lengkap, kami menghubungi pengguna dan mereka memberi tahu kami bahwa mereka menunggu beberapa hari antara mengisi keranjang dan mengirimkan pesanan, apa artinya itu sebenarnya sulit diketahui, karena orang tidak ingat itu.
Seumur hidup sesi PHP - 350000 (~ 4 hari dalam hitungan detik) Seumur hidup cookie - 345600 (4 hari)
Inilah pertanyaan aktual: bagaimana saya bisa mengetahui perilaku pengguna seperti apa yang menyebabkan pengecualian?
PEMBARUAN Sejauh ini saya tahu bahwa pengecualian terjadi dalam mengikuti kelas sesuai dengan permintaan yang dibuat, bagi saya itu tidak berarti apa-apa.
/catalogsearch/result/?q=… Mage_Core_Model_Session
/checkout/cart/ Mage_Core_Model_Session
/checkout/onepage/saveOrder/… Mage_Rss_Model_Session
/customer/account/loginPost/ Mage_Core_Model_Session
/customer/account/loginPost/ Mage_Reports_Model_Session
/customer/account/logout/ Mage_Reports_Model_Session
/catalog/product/view/… Mage_Reports_Model_Session
/catalog/product/view/… Mage_Tag_Model_Session
PEMBARUAN 2 : sesi disimpan dalam file dan dibersihkan oleh pemungut sampah sesi PHP, apakah ini pilihan yang baik atau tidak berada di luar cakupan pertanyaan ini.
sumber
Jawaban:
Setelah beberapa debugging lanjutan, sesi pelacakan dan memikirkan semua keajaiban itu saya dapat mereproduksi masalah dan memahami alasannya. Saya menyiapkan sedikit ilustrasi waktu, Anda dapat melihatnya di bawah.
/sales/order/save/...
permintaan)Berikut cara mereproduksi:
Alasan:
Ada sesi tertentu yang hanya dipakai pada permintaan yang diberikan, misalnya
Mage_Rss_Model_Session
hanya dipakai selama checkout aktual dan tidak saat browsing melalui katalog. Pada saat yang sama, timestamp kadaluwarsa sesi hanya diatur ketika sesi dipakai. Itu berarti bahwa jika ada cukup waktu antara dua checkout dan sesi tidak terbunuh sementara itu (karena pengguna logout atau cookie kedaluwarsa) kode Magento baru akan menganggap sesi itu tidak lulus validasi dan akan mengeluarkan pengecualian, yang entah bagaimana terdengar aneh untuk saya.Bagaimana cara memperbaiki:
Yah, saya punya beberapa pilihan:
Bagaimana saya mengetahuinya:
Saya mulai dengan menambahkan berikut ini ke kode asli
Mage_Core_Model_Session_Abstract_Varien
itu memberi saya wawasan yang baik tentang kelas yang terkena dampak dan korelasinya dan berapa banyak sesi yang berakhir. Tapi itu tidak menjelaskan mengapa itu terjadi dan tindakan pengguna mana yang mengarah ke masalah.
Kemudian saya mulai berpikir tentang bagaimana saya bisa melacak semua perubahan pada data sesi dan menemukan pertanyaan ini /superuser/368231/automatic-versioning-upon-file-change-modify-create-delete saya memutuskan untuk memberikan mencoba
git
danincron
kombinasi, tetapi setelah saya menerapkannya dan diuji di sandbox, saya menyadari bahwa saya akan kehabisan ruang disk yang sangat cepat dalam produksi.Saya memutuskan untuk membuat skrip PHP kecil yang akan men-decode data sesi dan menulis log untuk setiap sesi. Script ini dipanggil oleh
incron
dan di sini adalah
incrontab
entri yang sesuaioutput sampel
PS:
Versi saat ini keduanya
tidak dapat menangani pengecualian di atas selama permintaan AJAX. Mereka benar-benar tidak menampilkan apa pun kepada pengguna, sementara pengguna keluar secara efektif!
PPS:
rupanya versi Magento CE 1.9.3.x juga terpengaruh, lihat https://github.com/OpenMage/magento-mirror/blame/magento-1.9/app/code/core/Mage/Core/Model/Session/Abstract/ Varien.php
PPPS:
Ketika saya mengatakan "Hapus kode ini." Maksud saya mengecualikan blok berikut
Anda dapat melakukannya dengan banyak cara, termasuk:
$this->useValidateSessionExpire()
pengembalian menjadi benarsumber
<Mage_Rss>
dan yang memperbaiki masalah (perbaikan sementara) dan telah mengajukan tiket dengan dukungan magento.Cara lain untuk memperbaikinya (dan meningkatkan validasi sesi)
ColinM @ https://github.com/OpenMage/magento-lts
Sumber: https://github.com/OpenMage/magento-lts/commit/de06e671c09b375605a956e100911396822e276a
Memperbarui:
Perbaiki untuk
web/session/use_http_x_forwarded_for option
opsi yang dinonaktifkan ... https://github.com/OpenMage/magento-lts/pull/457/commits/ec8128b4605e82406679c3cd81244ddf3878c379sumber
Bagaimana Anda menyimpan sesi? (mis. dalam var / session / atau dalam DB, atau menggunakan mesin caching lainnya seperti Redis atau Memcached)
Apa pun yang Anda gunakan, pastikan izin menulis Anda sudah benar
var/session/
(biasanya diatur ke 755 untuk dir dan 644 untuk file), atau jika Anda menggunakan Redis atau Memcache, pastikan pengaturan koneksi dan batas waktu Anda baik untuk .Inchoo memiliki tutorial yang bagus untuk Redis: http://inchoo.net/magento/using-redis-cache-backend-and-session-storage-in-magento/
Jika menggunakan Memcache, periksa artikel ini (merujuk pada v1.10, tetapi seharusnya tidak jauh berbeda): http://www.magestore.com/magento/magento-sessions-disappearing-with-memcache-turned-on.html
Juga, jika Anda kebetulan menggunakan sesuatu seperti Varnish, ada masalah di masa lalu dengan sesi di mana lubang-lubang halaman tertentu diperlukan.
Terakhir, jika Anda menggunakan sistem file untuk sesi Anda, Anda mungkin merasa lega hanya dengan mengalihkan
<session_save>
node dilocal.xml
"db" alih-alih "file".Dari ini
<session_save><![CDATA[files]]></session_save>
Untuk ini
<session_save><![CDATA[db]]></session_save>
sumber
Detail oleh Anton Boritskiy fantastis. Tetapi alih-alih mengecualikan blok ini Anda bisa membuat salinan lokal sehingga Anda tidak mengedit inti dan menulis ulang blok seperti:
Ini memastikan bahwa perbandingan antara waktu () dan session_expire_timestamp hanya dieksekusi ketika kunci ada dan bahwa ketika sesi ditemukan yang tidak memiliki kunci (yaitu sesi pra 1.9.3) kunci ditambahkan.
sumber