Magento 2 – ecran alb în checkout (white screen of death) la un coș mare
Imaginează-ți un client care adaugă câteva zeci de produse în coș… trece la checkout… iar în loc de finalizarea comenzii vede un ecran alb.
Sună cunoscut? În Magento 2.4.x nu este o problemă rară – iar noi tocmai am trecut prin ea într-un proiect real.
Simptome
Checkout-ul funcționa corect cu coșuri mai mici.
La câteva zeci de produse – pagină albă.
În loguri nu apăreau mesaje sau erori.
Aleatoriu, checkout-ul funcționa, iar după un moment același coș afișa o pagină goală.
Pista numărul 1 – Redis?
Primele suspiciuni au fost legate de Redis: lock-uri de sesiune, concurrency, timeout-uri.
După dezactivarea Redis, sesiunile s-au mai stabilizat într-adevăr puțin, dar problema nu a dispărut deloc.
Pista numărul 2 – shipping.phtml
ddd
Debugând pas cu pas, am ajuns la fișierul:
vendor/magento/module-checkout/view/frontend/templates/cart/shipping.phtml
care încărca un JSON uriaș:
window.checkoutConfig = {$serializedCheckoutConfig};Sursa problemei – quoteItemData
S-a dovedit că vinovatul era linia din DefaultConfigProvider:
$output['quoteItemData'] = $quoteItemData;
adică toate datele despre produsele din coș. Iar în acest punct Magento încărca, printre altele, custom_attributes_serializable, care putea ajunge să cântărească… sute de MB.
Soluția
Cea mai simplă remediere: să elimini datele inutile înainte ca acestea să ajungă în checkoutConfig.
Am făcut acest lucru cu un plugin pe QuoteItem::setProduct():
public function afterSetProduct( MagentoQuoteModelQuoteItem $subject, $result, $product) { // główny winowajca $subject->setData('custom_attributes_serializable', null); return $result;}Rezultatul?
Checkout-ul a început să funcționeze stabil, chiar și cu coșuri mari.
Payload-ul JSON a scăzut de la câțiva/câteva zeci de MB la câteva sute de KB.
Concluzii
În Magento 2, checkout-ul poate fi foarte sensibil la ceea ce ajunge în quoteItemData.
Dacă aveți probleme cu ecrane albe în coș/checkout – verificați dimensiunea custom_attributes_serializable.
Uneori este suficient un plugin mic pentru a salva stabilitatea întregului magazin.
Ați avut experiențe similare cu checkout-ul? Ce alte cazuri ciudate v-au dat peste cap coșul în Magento? Împărtășiți-le în comentarii