Vấn đề này vẫn có thể tái tạo trên Magento 2.0.0 Ổn định.
Có một tính năng trong xử lý ngoại lệ Magento 2, ngăn chặn kết xuất các khối bị hỏng trong khi tất cả các khối khác vẫn được hiển thị. Trong chế độ nhà phát triển, nó bị vô hiệu hóa và tất cả các ngoại lệ được hiển thị ngay trong trình duyệt. Trong chế độ mặc định và sản xuất, nếu ngoại lệ xảy ra trong quá trình kết xuất khối, khối sẽ chỉ bị xóa khỏi đầu ra (ngoại lệ tương ứng vẫn được ghi vào var / log / system.log ). Xem \Magento\Framework\View\Layout::renderNonCachedElement()
.
Ngoại lệ sau xảy ra trong quá trình kết xuất khối thanh toán trên trang sản phẩm và đó là lý do tại sao khối này bị thiếu : main.CRITICAL: No such entity with customerId = [] []
.
Lý do cho ngoại lệ này là dữ liệu khách hàng trong lưu trữ phiên ở trạng thái không nhất quán ( customerLoggedIn == true
và dữ liệu khách hàng bị thiếu) sau khi \Magento\PageCache\Model\Layout\DepersonalizePlugin::afterGenerateXml()
thực hiện. Plugin này đóng phiên PHP hiện tại và do đó loại bỏ dữ liệu khách hàng khỏi lưu trữ phiên. Điều này chỉ xảy ra nếu trang có đầy đủ bộ nhớ cache (và thực tế là như vậy).
Trang được coi là có thể lưu trong bộ nhớ cache của mô-đun bộ đệm trang chỉ khi bố cục của nó không chứa các khối với cacheable="false"
. Việc thêm thuộc tính này sẽ không khiến khối này được tải bởi Ajax (như giả định trong câu hỏi). Để có một số khối được tải bởi Ajax, khối này phải có thuộc tính khai báo _isScopePrivate
được đặt thành true
, hơn nữa, không nên có khối nào cacheable="false"
trên trang. Xem \Magento\PageCache\Observer\ProcessLayoutRenderElement::execute()
và mage.pageCache._replacePlaceholder()
trong Magento / PageCache / view / frontend / web / js / page-cache.js . Đồng thời kiểm tra tài liệu cấp cao trong mô-đun bộ đệm trang readme
Trang sản phẩm không nên được lưu trong bộ nhớ cache vì cacheable="false"
được đặt cho khối thanh toán, tuy nhiên, do sự cố đã biết Các khối không thể truy cập được lưu vào bộ đệm . Cho đến khi vấn đề này được giải quyết, cách giải quyết sau đây có thể được sử dụng (đừng hỏi tôi tại sao nó hoạt động, đó là một câu chuyện dài):
- Đi đến
\Magento\Framework\Pricing\Render\Layout::__construct
- Thay đổi
['cacheable' => $generalLayout->isCacheable()]
thành['cacheable' => false]
Điều này không gây hại vì dù sao các trang sản phẩm sẽ không được lưu vào bộ nhớ cache sau khi thêm khối thanh toán
Một câu hỏi khác là, bạn có thực sự muốn làm cho các trang sản phẩm không thể lưu trong bộ nhớ cache bằng bộ đệm trang tích hợp hoặc Varnish không?