php 如何清除Magento2中单个product_id该高速缓存

z0qdvdin  于 2023-03-22  发布在  PHP
关注(0)|答案(4)|浏览(123)

我写了一个cron作业,检查库存数量的变化,已直接在数据库中,因此绕过Magento核心,这将处理到期该高速缓存。
我希望能够以以下方式使用对象管理器:

public function clearCacheforProduct($productID) {
    $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
    $cacheManager = $objectManager->get('\Magento\Framework\App\Cache\Manager');
    $cacheManager->clean('catalog_product_' . $productID);
}

当cron作业运行时,此操作当前会以静默方式失败。
如何清除该高速缓存中的单个产品ID?

lf3rwulv

lf3rwulv1#

感谢@bxN5。我设法在那里得到一些错误日志,并很快发现cacheManager的命名空间有点错误。
正确代码为:

$objectManager = \Magento\Framework\App\ObjectManager::getInstance(); 
$cacheManager = $objectManager->get('\Magento\Framework\App\CacheInterface');
$cacheManager->clean('catalog_product_' . $productID);

对于那些使用Magento运行Varnish的人来说,也有必要清除那里的数据,并且Magento调用似乎没有完全完成。所以我添加了一个cURL请求来完成特定的清除:

$varnishurl = "www.domainYouWantToPurge.co.uk";
$varnishcommand = "PURGE";
$productID = '760'; // This is the Magento ProductID of the item you want to purge
$curl = curl_init($varnishurl);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $varnishcommand);
curl_setopt($curl, CURLOPT_HTTPHEADER, ['X-Magento-Tags-Pattern: catalog_product_'.$productID]);
$result = curl_exec($curl);
curl_close($curl);

请确保在Varnish配置文件中正确设置了清除权限。

e37o9pze

e37o9pze2#

如果您查看\Magento\InventoryCache\Model\FlushCacheByProductIds,您将看到以下方法(Magento 2.2.3):

/**
 * Clean cache for given product ids.
 *
 * @param array $productIds
 * @return void
 */
public function execute(array $productIds)
{
    if ($productIds) {
        $this->cacheContext->registerEntities($this->productCacheTag, $productIds);
        $this->eventManager->dispatch('clean_cache_by_tags', ['object' => $this->cacheContext]);
    }
}

有了DI的支持,我会选择尽可能使用核心代码,而不是使用自己的代码。

  • 吻,然后擦干 *
cdmah0mi

cdmah0mi3#

我发现的最好的方法就是使用这个代码

$objectManager =   \Magento\Framework\App\ObjectManager::getInstance();
$productR =      $objectManager ->create('\Magento\Catalog\Api\ProductRepositoryInterface');
$product = $productR->get('product_sku');
$product->cleanCache();
$this->_eventManager->dispatch('clean_cache_by_tags', ['object' => $product]);

请在构造函数中初始化objectManager和ProductRepository
我现在用这种方法,它是工作一样的魅力

zi8p0yeb

zi8p0yeb4#

您只需加载产品对象并调用cleanCache()
首先像这样初始化$this-〉productRepository:

public function __construct(
   ...
   \Magento\Catalog\Api\ProductRepositoryInterface $productRepository
   ...
  )
  {
        $this->productRepository = $productRepository;
  }

然后在代码中调用:

$product = $this->productRepository->get($sku);
$product->cleanCache();

相关问题