Magento 2 – ecrã branco no checkout (white screen of death) com um carrinho grande
Imagine um cliente que adiciona dezenas de produtos ao carrinho… avança para o checkout… e, em vez da caixa, vê um ecrã branco.
Parece familiar? No Magento 2.4.x, este não é um problema raro — e acabámos de o resolver num projeto real.
Sintomas
O checkout funcionava corretamente com carrinhos mais pequenos.
Com dezenas de produtos — página branca.
Nos logs, não havia mensagens nem erros.
Aleatoriamente, o checkout funcionava e, pouco depois, o mesmo carrinho apresentava uma página vazia.
Pista n.º 1 – Redis?
As primeiras suspeitas recaíram sobre o Redis: bloqueios de sessão, concorrência, timeouts.
Depois de desativar o Redis, as sessões ficaram de facto um pouco mais estáveis, mas o problema não desapareceu de todo.
Pista n.º 2 – shipping.phtml
ddd
Ao fazer debug passo a passo, chegámos ao ficheiro:
vendor/magento/module-checkout/view/frontend/templates/cart/shipping.phtml
que carregava um JSON gigante:
window.checkoutConfig = {$serializedCheckoutConfig};Origem do problema – quoteItemData
Descobrimos que o culpado era uma linha em DefaultConfigProvider:
$output['quoteItemData'] = $quoteItemData;
ou seja, todos os dados sobre os produtos no carrinho. E, neste ponto, o Magento carregava, entre outros, custom_attributes_serializable, que podia chegar a pesar… centenas de MB.
Solução
O fix mais simples: remover os dados desnecessários antes de chegarem ao checkoutConfig.
Fizemo-lo com um plugin em QuoteItem::setProduct():
public function afterSetProduct( MagentoQuoteModelQuoteItem $subject, $result, $product) { // główny winowajca $subject->setData('custom_attributes_serializable', null); return $result;}O resultado?
O checkout passou a funcionar de forma estável, mesmo com carrinhos grandes.
O payload JSON desceu de vários/dezenas de MB para algumas centenas de KB.
Conclusões
No Magento 2, o checkout pode ser muito sensível ao que entra em quoteItemData.
Se tiverem problemas com ecrãs brancos no carrinho/checkout, verifiquem o tamanho de custom_attributes_serializable.
Por vezes, basta um pequeno plugin para salvar a estabilidade de toda a loja.
Já tiveram aventuras semelhantes com o checkout? Que outros casos estranhos vos fizeram falhar o carrinho no Magento? Partilhem nos comentários