这个问题在Magento 2.0.0稳定版上仍然可以重现。
Magento 2异常处理中有一个功能,可以防止在仍然渲染所有其他块的情况下渲染损坏的块。在开发人员模式下,它被禁用,所有异常都直接显示在浏览器中。在默认模式和生产模式下,如果在块渲染期间发生异常,则将从输出中删除该块(相应的异常仍记录到var / log / system.log)。请参阅\Magento\Framework\View\Layout::renderNonCachedElement()
。
在产品页面上检出块呈现期间发生以下异常,这就是缺少此块的原因:main.CRITICAL: No such entity with customerId = [] []
。
发生此异常的原因是,会话存储中的customerLoggedIn == true
客户数据在\Magento\PageCache\Model\Layout\DepersonalizePlugin::afterGenerateXml()
执行后处于不一致状态(并且客户数据丢失)。该插件关闭当前的PHP会话,从而从会话存储中删除客户数据。仅当页面是完全可缓存的(实际上是)时,才会发生这种情况。
仅当页面布局中不包含带有的块时,页面才被页面缓存模块视为可缓存cacheable="false"
。添加此属性将不会使Ajax加载此块(如问题中所假定的)。要让Ajax加载某些块,该块应具有声明的属性,该属性_isScopePrivate
设置为true
,而且cacheable="false"
页面上不应有带的块。请参阅\Magento\PageCache\Observer\ProcessLayoutRenderElement::execute()
和mage.pageCache._replacePlaceholder()
在Magento / PageCache / view / frontend / web / js / page-cache.js中。还要检查页面缓存模块自述文件中的高级文档
由于cacheable="false"
已为checkout块设置了产品页面,因此该页面不可缓存,但是由于已知问题,无法缓存不可缓存的块。在解决此问题之前,可以使用以下变通办法(不要问我为什么起作用,这是一个很长的故事):
- 去
\Magento\Framework\Pricing\Render\Layout::__construct
- 更改
['cacheable' => $generalLayout->isCacheable()]
为['cacheable' => false]
这不会造成危害,因为添加检出代码块后无论如何都不会缓存产品页面
另一个问题是,您是否真的要通过内置页面缓存或Varnish使产品页面不可缓存?