Magento 2 – schermata bianca nel checkout (white screen of death) con un carrello grande
Immagina un cliente che aggiunge decine di prodotti al carrello… passa al checkout… e invece della cassa vede una schermata bianca.
Ti suona familiare? In Magento 2.4.x non è un problema raro: lo abbiamo appena affrontato su un progetto reale.
Sintomi
Il checkout funzionava correttamente con carrelli più piccoli.
Con decine di prodotti: pagina bianca.
Nei log nessun messaggio né errore.
In modo casuale il checkout funzionava, e poco dopo lo stesso carrello mostrava una pagina vuota.
Pista numero 1 – Redis?
I primi sospetti sono caduti su Redis: lock di sessione, concurrency, timeout.
Dopo aver disattivato Redis, le sessioni si sono effettivamente stabilizzate un po’, ma il problema non è affatto scomparso.
Pista numero 2 – shipping.phtml
ddd
Eseguendo il debug passo dopo passo siamo arrivati al file:
vendor/magento/module-checkout/view/frontend/templates/cart/shipping.phtml
che caricava un JSON gigantesco:
window.checkoutConfig = {$serializedCheckoutConfig};Origine del problema – quoteItemData
Si è scoperto che il colpevole era una riga in DefaultConfigProvider:
$output['quoteItemData'] = $quoteItemData;
cioè tutti i dati sui prodotti nel carrello. Ed è proprio qui che Magento caricava, tra le altre cose, custom_attributes_serializable, che poteva arrivare a pesare… centinaia di MB.
Soluzione
Il fix più semplice: rimuovere i dati non necessari prima che finiscano in checkoutConfig.
Lo abbiamo fatto con un plugin su QuoteItem::setProduct():
public function afterSetProduct( MagentoQuoteModelQuoteItem $subject, $result, $product) { // główny winowajca $subject->setData('custom_attributes_serializable', null); return $result;}Il risultato?
Il checkout ha iniziato a funzionare in modo stabile, anche con carrelli grandi.
Il payload JSON è sceso da diversi MB/oltre una decina di MB a poche centinaia di KB.
Conclusioni
In Magento 2 il checkout può essere molto sensibile a ciò che finisce in quoteItemData.
Se avete problemi con schermate bianche nel carrello/checkout, controllate la dimensione di custom_attributes_serializable.
A volte basta un piccolo plugin per salvare la stabilità dell’intero store.
Avete avuto esperienze simili con il checkout? Quali altri casi strani vi hanno mandato in crisi il carrello in Magento? Condivideteli nei commenti