我们对 Magento 2 的 Api 存在一个问题,涉及全页缓存以及来自 ERP 系统的其余 API 的更新。 ERP 不断通过 API 推送库存、库存和产品更新,进而刷新每次产品更新的缓存,从而形成始终不缓存的网站。我们尝试包装 FlushCacheByTags 类以防止其余调用刷新缓存。这似乎受到了打击,但缓存仍在被清除。这是类覆盖:
<?php
/**
*
* Copyright © 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Namespace\Module\Magento\Framework\App\Cache;
/**
* Automatic cache cleaner plugin
*/
class FlushCacheByTags extends
\Magento\Framework\App\Cache\FlushCacheByTags
{
/**
* @var \Psr\Log\LoggerInterface
*/
protected $_logger;
/**
* FlushCacheByTags constructor.
* @param \Magento\Framework\App\Cache\Type\FrontendPool $cachePool
* @param \Magento\Framework\App\Cache\StateInterface $cacheState
* @param array $cacheList
* @param null $tagResolver
* @param \Psr\Log\LoggerInterface $_logger
*/
public function __construct(
\Magento\Framework\App\Cache\Type\FrontendPool $cachePool,
\Magento\Framework\App\Cache\StateInterface $cacheState,
array $cacheList,
\Psr\Log\LoggerInterface $_logger,
$tagResolver = null
)
{
parent::__construct($cachePool, $cacheState, $cacheList, $tagResolver);
$this->_logger = $_logger;
}
/**
* Clean cache on save object
*
* @param \Magento\Framework\Model\ResourceModel\AbstractResource $subject
* @param \Closure $proceed
* @param \Magento\Framework\Model\AbstractModel $object
* @return \Magento\Framework\Model\ResourceModel\AbstractResource
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function aroundSave(
\Magento\Framework\Model\ResourceModel\AbstractResource $subject,
\Closure $proceed,
\Magento\Framework\Model\AbstractModel $object
) {
$this->_logger->debug('CACHE SAVE - instance of: '. print_r(get_class($object),true));
if (
// is instance of
/* @var $object \Magento\Catalog\Model\Product */
$object instanceof \Magento\Catalog\Model\Product
&& (
// is rest api request
isset($_SERVER['REQUEST_URI']) && strpos($_SERVER['REQUEST_URI'],'/rest') === 0
)
&& (
// has data
!empty($object->getData())
)
) {
$this->_logger->debug('Cache NOT flushed from API SKU#: '.print_r($object->getSku(),true));
return $proceed($object);
}
return parent::aroundSave($subject, $proceed, $object);
}
/**
* Clean cache on delete object
*
* @param \Magento\Framework\Model\ResourceModel\AbstractResource $subject
* @param \Closure $proceed
* @param \Magento\Framework\Model\AbstractModel $object
* @return \Magento\Framework\Model\ResourceModel\AbstractResource
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function aroundDelete(
\Magento\Framework\Model\ResourceModel\AbstractResource $subject,
\Closure $proceed,
\Magento\Framework\Model\AbstractModel $object
) {
$this->_logger->debug('CACHE DELETE - instance of: '. print_r(get_class($object),true));
if (
// is instance of
/* @var $object \Magento\Catalog\Model\Product */
$object instanceof \Magento\Catalog\Model\Product
&& (
// is rest api request
isset($_SERVER['REQUEST_URI']) && strpos($_SERVER['REQUEST_URI'],'/rest') === 0
)
){
$this->_logger->debug('Cache NOT flushed from API SKU#: '.print_r($object->getSku(),true));
return $proceed($object);
}
return parent::aroundDelete($subject, $proceed, $object);
}
}
我们在这里遗漏了什么吗?我们希望能够通过 API 将数据推送到数据库并自行处理刷新,而不是每次产品都通过 API 更新。我们已经实现了缓存预热器来尝试对抗刷新,但它无法跟上缓存刷新的频率。
以下是我在 API 的产品更新日志中看到的内容
[2017-06-09 21:26:05] report.DEBUG: CACHE SAVE - instance of:
Magento\Catalog\Model\Product\Interceptor {"is_exception":false} []
[2017-06-09 21:26:05] report.DEBUG: Cache NOT flushed from API SKU#:
270876 {"is_exception":false} []
[2017-06-09 21:26:05] report.DEBUG: cache_invalidate {"method":"PUT","url":"https://obscuredforsecurity.com/rest/all/V1/products/270876","invalidateInfo":{"tags":["catalog_product_0"],"mode":"matchingAnyTag"},"is_exception":false} []