Magento 2 – biały ekran w checkout (white screen of death) przy dużym koszyku
Wyobraź sobie klienta, który dodaje kilkadziesiąt produktów do koszyka… przechodzi do checkoutu… i zamiast kasy widzi biały ekran.
Brzmi znajomo? W Magento 2.4.x to nie jest rzadki problem – i właśnie przerobiliśmy go na żywym projekcie.
Objawy
-
Checkout działał poprawnie przy mniejszych koszykach.
-
Przy kilkudziesięciu produktach – biała strona.
-
W logach brak komunikatów oraz błędów.
-
Losowo checkout działał, a po chwili ten sam koszyk wywalał pustą stronę.
Trop numer 1 – Redis?
Pierwsze podejrzenia padły na Redis: locki sesji, concurrency, timeouty.
Po wyłączeniu Redis sesje faktycznie trochę się uspokoiły, ale problem wcale nie zniknął.
Trop numer 2 – shipping.phtml
ddd
Debugując krok po kroku doszliśmy do pliku:
vendor/magento/module-checkout/view/frontend/templates/cart/shipping.phtml
który ładował gigantyczny JSON:
window.checkoutConfig = {$serializedCheckoutConfig};
Źródło problemu – quoteItemData
Okazało się, że winowajcą jest linijka w DefaultConfigProvider:
$output['quoteItemData'] = $quoteItemData;
czyli wszystkie dane o produktach w koszyku. I w tym miejscu Magento ładowało między innymi custom_attributes_serializable, które potrafiło ważyć… setki MB.
Rozwiązanie
Najprostszy fix: wyciąć niepotrzebne dane zanim trafią do checkoutConfig.
Zrobiliśmy to pluginem na Quote\Item::setProduct():
public function afterSetProduct( \Magento\Quote\Model\Quote\Item $subject, $result, $product ) { // główny winowajca $subject->setData('custom_attributes_serializable', null); return $result; }
Efekt?
-
Checkout zaczął działać stabilnie, nawet przy dużych koszykach.
-
Payload JSON spadł z kilku/kilkunastu MB do kilkuset KB.
Wnioski
-
W Magento 2 checkout potrafi być bardzo wrażliwy na to, co wpadnie do quoteItemData.
-
Jeśli macie problemy z białymi ekranami w koszyku/checkout – sprawdźcie rozmiar custom_attributes_serializable.
-
Czasem wystarczy jeden mały plugin, żeby uratować stabilność całego sklepu.
Mieliście podobne przygody z checkoutem? Jakie inne dziwne przypadki rozwalały Wam koszyk w Magento? Podzielcie się w komentarzach