2017-06-09 2 views
1

ERPシステムの残りのAPIからのフルページキャッシュと更新に関するMagento 2のApiに問題があります。 ERPは、APIを使用して在庫、在庫、製品の更新を常に進めています。これにより、製品の更新ごとにキャッシュがフラッシュされ、キャッシュされていないウェブサイトが一貫しています。 FlushCacheByTagsクラスをラップして、残りの呼び出しがキャッシュをフラッシュしないようにしました。これはヒットしているようですが、キャッシュはまだクリアされています。ここにクラスオーバーライドがあります:Magento 2 Rest製品のアップデート時にApiがキャッシュをあまりに頻繁に消去しています

<?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を介して製品が更新される毎回ではなく、それ自身の協調でフラッシュを処理できるようにしたいと考えています。キャッシュをウォーマーで実装しようとしていますが、キャッシュを消去する頻度に追いつけません。ここで

は、我々は、Magentoの\ページキャッシュ\オブザーバー\ FlushCacheByTags

\ の上書きを作成し、これを修正するために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} [] 

答えて

1

から製品アップデートのログに私が見ていますどのようなここにされていますexecuteメソッドの基本。私たちは実際にAPIがキャッシュをフラッシュして "FlushNow"ヘッダーを実装し、そのヘッダーがリクエストに設定されていて、キャッシュを通常どおりにフラッシュできるようにするというシナリオがある場合に問題に遭遇しました。また、同様の機能を実装して、管理者のカテゴリと製品の自動保存からキャッシュを削除し、マーケティング部門をフルページキャッシュへのアクセスからブロックすることを防ぐ必要がありました。

** Mirasvitsキャッシュウォーミングエクステンションを使用してキャッシュを温め、エクステンションに同様の機能を実装して、キャッシュが管理者(非API)からフラッシュされないようにします。 https://mirasvit.com/magento-2-extensions/full-page-cache-warmer.html

/** 
* overide for \Magento\PageCache\Observer\FlushCacheByTags 
* Log calls to cache instead of clearing it 
* 
* @param Observer $observer 
* @return void 
*/ 
public function execute(Observer $observer) 
{ 
    if ($this->_config->getType() == Config::BUILT_IN && $this->_config->isEnabled()) { 
     /** @noinspection PhpUndefinedMethodInspection */ 
     $object = $observer->getEvent()->getObject(); 
     if (!is_object($object)) { 
      return; 
     } 
     $tags = $this->_tagResolver->getTags($object); 
     $flush = $this->request->getHeaders('flushNow'); 
     $flush = $flush ? $flush->getFieldValue() : false; 

     if (!empty($tags)) { 
      if (
       $flush == false && (
        (bool) $this->_scopeConfig->getValue(self::BLOCK_ALL) 
        || (
         (bool) $this->_scopeConfig->getValue(self::BLOCK_API_CRON) 
         && (
          !isset($_SERVER['REQUEST_URI']) 
          || preg_match('/^\/rest\/all\/V1/', $_SERVER['REQUEST_URI']) 
         ) 
        ) 
       ) 
      ) { 
       // Blocked entirely, Magento cron, or API request - Don't flush 
       if ((bool) $this->_scopeConfig->getValue(self::DEBUG_LOG)) { 
        $this->writeToLog($tags); 
       } 
      } else { 
       if($flush){ 
        $this->eventLogger->saveLog('cache_management','clean',json_encode($tags),true, 'api_cache_flush', true); 
       } 
       $this->_fullPageCache->clean(\Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG, array_unique($tags)); 
      } 
     } 
    } 
} 
関連する問題