【问题标题】:What does "invalidated" cache mean in Magento?Magento 中的“无效”缓存是什么意思?
【发布时间】:2011-12-07 22:35:42
【问题描述】:

在缓存管理下的 Magento 管理员中,当它显示缓存为无效时是什么意思? Magento 如何知道缓存无效?特别是,我想知道 HTML 块缓存。什么情况会导致此缓存显示为无效?

【问题讨论】:

    标签: magento


    【解决方案1】:

    在 Magento 中,每当您对产品、静态块等进行更改时,它都会识别出数据库中的数据与缓存中的数据不同。不幸的是,Magento 并没有意识到 什么 缓存数据是不同的,只是 something 是不同的。

    您需要进入系统>缓存管理并刷新失效的缓存类型。

    编辑:

    创建一个模块(或使用现有模块),您可以使用它来设置 cron 作业以刷新缓存。创建文件:{namespace}/{modulename}/Model/Observer.php

    在那个文件里面:

    <?php
    class <namespace>_<modulename>_Model_Observer {
    
      public function refreshCache() {
        try {
          $allTypes = Mage::app()->useCache();
          foreach($allTypes as $type => $blah) {
            Mage::app()->getCacheInstance()->cleanType($type);
          }
        } catch (Exception $e) {
          // do something
          error_log($e->getMessage());
        }
      }
    
    }
    

    在你的模块的 etc/config.xml 中:

    <config>
      ...
      <crontab>
        <jobs>
          <{modulename}_refresh_cache>
            <schedule><cron_expr>* * * * *</cron_expr></schedule>
            <run><model>{modulename}/observer::refreshCache</model></run>
          </{modulename}_refresh_cache>
        </jobs>
      </crontab>
      ...
    </config>
    

    现在只要在您的服务器上正确配置了 cron,缓存就会自动更新,就像 cron 运行的频率一样。

    【讨论】:

    • 我了解如何刷新缓存,当我看到它已失效时我会这样做。我只是不太明白它是如何知道缓存已失效的。和相关的 - 如果它知道它是无效的,它为什么不自动刷新缓存?刷新缓存有风险吗?
    • 每当您进行更改时,magento 都会触发事件。这些事件的侦听器使相关缓存无效。至于为什么这样做(以及为什么不自动刷新),这最终是一个设计决策,但可能与能够暂存内容有关。例如,您可以对多个相互关联的产品进行更改,然后可以刷新缓存。我已经通过每次 cron 在服务器上运行时运行的 cron 作业来克服这个问题,并调用一个函数来自动刷新缓存。我将编辑我的原始答案以包含代码。
    • 非常糟糕的解决方案:设置一个刷新所有缓存的 cron,每次运行时,就像禁用缓存...您至少应该检查缓存是否无效并每 10 次设置 cron/ 30 分钟 ...
    • 正确的解决方案是 Magento 需要在任何时候作为其核心系统的一部分进行产品更改时自动重建缓存文件。这样,我们就不必手动参与流程或编写调度程序作业来处理可能需要的情况。似乎 Magento 在产品更新过程中只差了 1 步。
    • 你的答案是正确的,但你的修正是完全错误的。每 5 分钟删除一次缓存的所有内容会使网站比根本不激活任何缓存还要慢。请参阅@WagnerBertoliniJunior 的答案以获得相关的解决方法。
    【解决方案2】:

    到目前为止,没有一个答案提供了正确的定义,也没有一个解决方案。所以我决定死神回答:-)

    显示缓存无效是什么意思?

    这意味着缓存的数据不反映来自数据库的实际数据。就这么简单。

    现在,没有被问到的重要问题是导致失效发生的原因。这基本上有两个主要原因:

      1234563 /strong>
    • 重新索引未运行。这意味着可能没有设置 Magento cron。重新索引是触发更新单个缓存条目的原因。另一个子原因是重新索引设置为“保存时”,然后在保存产品/CMS 页面时页面超时/过早关闭等。
    • 最不可能(但仍然有效)是 Magento 错误或一些需要彻底清除缓存的主要设置更改。

    解决方案是:

    • 摆脱将直接 SQL 查询引入 Magento 代码库的任何插件(或开发人员!)
    • 确保 Magento cron 已配置并正在运行,确保将索引设置为“按计划”更新

    像“清理缓存无效”这样的解决方案绝对是粗俗的。那是解决症状而不是根本原因。这是以许多丢失的转换(读取 = 金钱)为代价的,因为您实际上是在无缓存运行 - 即使是普通商店,也可能需要几天时间才能从单个缓存清理中完全恢复并将缓存预热到其全部潜力。

    【讨论】:

      【解决方案3】:

      2015:AOE Sheduler 能够通过 cronjob 清理缓存。 换工作

      “core_clean_cache”

      30 2 * * *(每天 2:30)到59 * * * *(每 59 分钟)。

      【讨论】:

        【解决方案4】:

        @Magento Guy 的回答是正确的,但我认为下面的这个解决方案可以帮助您刷新 Magento 上的无效缓存。

        我使用 Bitnami Magento Stack,对我来说,下面的这个解决方案是我找到的最好的。

        我尝试创建一个 Mage_Shell_Class php 文件,但没有成功(无效的缓存数组在运行时总是为空,无论如何,我真的不知道为什么)。

        我创建了一个 php 文件“sample.php”:

        <?php
        
        require 'app/Mage.php';
        
        $invalid = Mage::app()->getCacheInstance()->getInvalidatedTypes();
        
        foreach($invalid as $i)
        {
            Mage::app()->getCacheInstance()->cleanType($i["id"]);
        }
        

        我已将它放在 magento 根文件夹中,要启动它,我使用在 root 用户下运行的 cronjob。

        所以,要在 root 用户上创建 cronjob:

        sudo crontab -u root -e
        

        这是我运行它的命令行:

        * * * * * . /opt/bitnami/scripts/setenv.sh ; /opt/bitnami/php/bin/php /opt/bitnami/apps/magento/htdocs/sample.php >> /var/log/cron/cron.log 2>&1
        

        这一行的某些部分对我的问题非常特殊:

        1. 由于它只是刷新无效的缓存,我决定每分钟运行一次。
        2. setenv.sh 是一个脚本,可以帮助我在处理这个特定的 bitnami 堆栈时设置环境。
        3. 为了获得此脚本的输出,我使用了最后一部分“>> /var/log/cron/cron.log 2>&1”将错误输出到我创建的目录 (/var/log/cron ),并已授予正确的权限。

        可能您需要更改 cron 行命令,但我认为这会对您有所帮助。

        【讨论】:

          猜你喜欢
          • 2015-03-22
          • 2023-03-12
          • 1970-01-01
          • 2012-09-18
          • 2023-03-25
          • 1970-01-01
          • 2014-04-19
          • 2014-05-10
          • 2015-01-17
          相关资源
          最近更新 更多