Soruna PHP oturum işleyicisi tarafından yerleştirilen bir kilit neden olur. Bu yüzden Magento açıkça bir şeyleri kilitlemek ve yönetici isteklerini engellemeye çalışmak değil, dosya tabanlı oturum depolamasının neredeyse bir yan etkisi.
Bir yazma kilidi çağırdığında kilit serbest kalıncaya kadar bloğun ikinci bir isteğe neden ilk (uzun soluklu) isteğe göre açılır oturum veri dosyası yerleştirilir olan session_start
bölgesindekiMage_Core_Model_Session_Abstract_Varien::start
Bu% 100 tekrarlanabilir. Yaptığınız aynı yöntemi kullandım sleep(30)
, üstüne birMage_Adminhtml_IndexController::globalSearchAction
Dikkate değer bir db oturum depolama kullanıyorsanız bu çoğaltılamaz olduğunu. Kök nedenini bulduktan sonra, db oturum depolamasına bir sanal alan ayarladım ve artık sorunu yeniden oluşturamadım. Yani Magento db oturum işleyicileri oturum yazma kilitlemek için satır düzeyinde kilitleme kullanmıyor gibi görünüyor. Bu ilginç buluyorum, çünkü uygulama açıkça aynı oturuma yazma birden çok iş parçacıkları için muhasebe değil çünkü oturum veri kaybı potansiyeli vardır. Okuyucular için Not: Bunu denemek ve çözmek için üretimde asla db oturum depolamasını kullanmazdım, sadece MySql veritabanınızı aşırı yüklemek için iyidir.
Redis gibi bellek tabanlı oturum depolama sistemlerini kullanarak davranışı yeniden oluşturmayı denemedim, ama tahminim oturum deposundaki kayıtların kilitlenmesinin muhtemelen bu göz ardı edildi.
Bunu önlemek session_write_close
için uzun süren bir işe başlamadan önce kilidi açmak için kullanmak gibi teknikler vardır . Ancak bu, yeni kapattığınız için oturuma yazmanızı da engeller. Bu nedenle, Magento'daki genel kurulda kolayca uygulanması muhtemel değildir, ancak potansiyel olarak belirli rotalara / kontrolörlere uygulanabilir.
Bu kök nedeni olarak sabitlemek için benim teknik Xdebug profiler etkinleştirmek ve "cachegrind" dosyasını sınamak oldu. İkinci istek tamamlandıktan sonra, çıktı dosyasını (~ 25 MB günlük) MacCallGrind'e yükledim ve kapsayıcı sürenin 28 saniye veya daha fazla olduğu çağrıların yolunu izleyerek deldim . Bu sonuçta beni session_start
~ 28 saniye süren aramaya götürdü ve araştırma yapmak için bana harika bir nokta verdi.
DÜZENLEME: ilgilenenler için, ben oldum bir ekran görüntüsü yayınlanmıştır Twitter'da MacCallGrind bakıldığında "cachegrind" dosyasının.