刷新缓存和管理编译器的正确方法


25

我想知道是否有以下首选程序:

  1. Magento缓存的刷新
  2. 启用/禁用Magento编译器

1.冲洗Magento缓存

这里有一些选择,即:

  • 检查订单项并从Actions下拉框中提交刷新
  • 单击Flush Magento Cache按钮,然后
  • 点击Flush Storage Cache按钮

是否有优先顺序执行这些操作?Magento缓存和存储缓存之间有什么区别?

2.启用/禁用Magento编译器

a)启用编译器

在启用Magento编译器时,是否应该启用所有存储缓存?还是应该仅在启用编译器并运行编译过程后才激活缓存?启用编译器后,是否应该刷新所有缓存?如果是这样,那是否包括刷新Magento缓存和存储缓存(如上所述)?

b)禁用编译器

关于禁用Magento编译器,您是否应该先禁用所有缓存,然后在禁用后重新启用它们?

保留缓存与禁用/启用编译器之间有什么区别吗?它会对性能造成什么影响?

任何输入将不胜感激


它很容易记住。不要刷新生产存储中的缓存。不要在开发存储上启用缓存。
Ben Lessani-Sonassi 2014年

1
而且,如果刷新生产存储中的缓存导致站点崩溃,则您没有在登台服务器上进行足够的测试,并且通过了一些错误的代码,因此“请勿在开发存储上启用缓存”。刷新缓存永远不会导致Magento崩溃。CBR错误(准备就绪之前提交)
Fiasco Labs 2015年

Answers:


20

刷新Magento缓存 -清除Magento知道已创建的所有项目的缓存(变量/缓存)。

刷新缓存存储 -清除var / cache中的所有内容,而不管其中的那些文件是如何创建的。

因此,如果您想安全地清除所有内容,则可以选择“ Flush Cache Storage ”,这实际上将清除var / cache。

对于编译器,我建议在启用编译并运行编译过程后刷新Magento缓存。这样可以确保清除缓存中的所有未编译数据。

禁用编译时,我会先禁用它,然后再刷新Magento缓存。再次确保缓存清除了所有编译数据。

除非您进行大量测试,否则我始终建议您保留缓存。就性能而言,编译可能会失败。我已经看到它使事情变得更快,并且很多次看到编译使事情变得更慢并且会引起第三方扩展的问题。我建议在关闭编译的情况下(使用Firebug /开发人员工具)获取类别页面加载时间的基线,然后在打开编译的情况下再次获取基线,看看是否存在较大差异。

使用PHP中的操作码缓存,正确的MySQL查询缓存,合并CSS / js文件,使用gzip压缩,使用全页缓存扩展以及对文件的浏览器缓存进行适当的设置,可能会更好。


15

Magento缓存没有什么不同。从基础开始,可以通过导航到

系统->缓存管理

在后端。您可以看到可以启用/禁用的不同缓存区域,例如任何配置,layout.xml,块,整页和api文件。显然,理想的是在网站上线后启用所有这些功能。

也可以从此处清除或刷新缓存。按下标有按钮的按钮“Flush Magento Cache”将刷新所有与Magento使用的一组内置默认标签匹配的缓存文件。这是清除缓存的“安全”方法,因为它不能绝对清除所有内容。如果您正在使用任何辅助缓存类型,则单击“Flush Cache Storage”将确保清除了缓存,因为它会清除所有内容。您在管理页面上看到的其他两个按钮将清除javascript和css以及目录图像。

清除缓存的另一种但不太安全的方法是导航到

websiteroot / var / cache

并手动删除所有文件。一样

websiteroot / var / full_page__cache

如果启用了全页缓存。

企业版上提供的全页缓存可将您的网站速度提高10倍,但是了解一点很重要,以防万一您注意到正在缓存任何动态内容。一个有趣的文件是

websiteroot / app / code / core / Enterprise / PageCache / etc / cache.xml

在这里,您可以查看FPC正在缓存的内容,块名称,容器名称和会话生存期。如果您发现绝对有必要从高速缓存中编辑或删除任何这些块,则可以通过创建一个依赖PageCache模块的模块,然后在其中进行任何修改来实现。

占位符标签告诉FPC该块被认为是动态的。加载页面时,如果该块尚未在缓存中,则在缓存中搜索占位符标记中的该ID值,如果不存在,则调用并生成该块,并将该ID添加到缓存。

Magento的编译功能可以在下面找到

系统>工具>编译

如果您正在运行全新安装,则可能会收到系统消息,指出两个includes and includes/src/目录都必须可写。完成此操作后,我们可以单击“运行编译过程”按钮,您基本上已经完成了,Magento核心正在使用编译。

当Magento编译其源代码时,该框架会执行一些操作。通过admin或触发shell, see shell/compiler.php,所有编译都由一个类完成:Mage_Compiler_Model_Process。在本课程中,您将找到以下片段,它实际上是整个过程的鸟瞰图。

/**
     * Run compilation process
     *
     * @return Mage_Compiler_Model_Process
     */
    public function run()
    {
        $this->_collectFiles();
        $this->_compileFiles();
        $this->registerIncludePath();
        return $this;
    }

$this->_collectFiles();通话开始后,Magento从两个站点复制了所有PHP文件。

应用/代码

和lib目录到

/ includes / src

目录。如下面的代码片段所示:在此过程中,Magento递归遍历所有文件和目录。这些路径最终用作文件名。当递归过程命中文件时,它将检查PHP扩展名,并且在找到文件后将其复制到编译器目录中。其他文件类型保持不变。

例如:类Mage_Catalog_Model_Category的路径为

应用程序/代码/核心/法师/目录/模型/Category.php

但是,启用编译后,现在变成

includes / src / Mage_Catalog_Model_Category.php

/**
     * Copy files from all include directories to one.
     * Lib files and controllers files will be copied as is
     *
     * @return Mage_Compiler_Model_Process
     */
    protected function _collectFiles()
    {
        $paths  = $this->_getIncludePaths();
        $paths  = array_reverse($paths);
        $destDir= $this->_includeDir;
        $libDir = Mage::getBaseDir('lib');

        $this->_mkdir($destDir);
        foreach ($paths as $path) {
            $this->_controllerFolders = array();
            $this->_copy($path, $destDir); // this one will run recursively through all directories
            $this->_copyControllers($path);
            if ($path == $libDir) {
                $this->_copyAll($libDir, $destDir);
            }
        }

        $destDir.= DS.'Data';
        $this->_mkdir($destDir);
        $this->_copyZendLocaleData($destDir);
        return $this;
    }

管制员正在接受另一种待遇。将所有控制器目录复制到

包括/源/

但要存储在一个具有相关命名空间名称的目录中,请考虑:Mage,Enterprise或您自己的给定命名空间。

在这些名称空间目录中,控制器按模块存储,并且控制器目录结构保持不变。文件名也一样,只是一个完全相同的副本。所有这些逻辑都可以在以下方法中找到$this->_copyControllers($path);

第二层编译从管理员那里收集所有范围和它们各自的类列表。所有这些作用域都通过获取相关类文件的内容并将其写入以给定作用域命名的单个文件中进行处理。

/**
     * Compile classes code to files
     *
     * @return Mage_Compiler_Model_Process
     */
    protected function _compileFiles()
    {
        $classesInfo = $this->getCompileClassList();

        foreach ($classesInfo as $code => $classes) {
            $classesSorce = $this->_getClassesSourceCode($classes, $code);
            file_put_contents($this->_includeDir.DS.Varien_Autoload::SCOPE_FILE_PREFIX.$code.'.php', $classesSorce);
        }

        return $this;
    }

默认情况下,Magento创建四个不同的范围文件:

__default.php,__ catalog.php,__ checkout.php和__cms.php

在构建这些范围文件的过程中,Magento会自动解析范围列表中提供的类正在使用的所有类扩展和接口。

放置好所有文件并进行编译后,Magento准备启用编译功能以供使用。

最后但并非最不重要的一点是,调整与编译相关的配置。可以includes/config.php在以下位置找到此文件,并保存以下两个常量。启用编译后,关于COMPILER_INCLUDE_PATH的行将不加注释,因此可以立即采取行动。

> #define('COMPILER_INCLUDE_PATH', dirname(__FILE__).DIRECTORY_SEPARATOR.'src');
> #define('COMPILER_COLLECT_PATH', dirname(__FILE__).DIRECTORY_SEPARATOR.'stat');

可以在的registerIncludePath方法中找到负责调整配置文件的代码Mage_Compiler_Model_Process class

在引导过程中,编译配置文件包含在中index.php file (around line 44)。这使得include_path常量在整个框架中都可用。您只能手动启用collect_path来获取有关已编译文件的使用情况的更多统计信息。不应实时启用此功能。

/**
 * Compilation includes configuration file
 */
$compilerConfig = 'includes/config.php';
if (file_exists($compilerConfig)) {
    include $compilerConfig;
}

从这一点开始,Magento将使用以下语句检查是否启用了编译模式。遍历代码库(使用'grep'),您会发现大多数逻辑可以在lib/Varien/Autoload.php文件中找到。

if (defined('COMPILER_COLLECT_PATH')) {
            // do stuff
        }

寻找的另一个地方是Mage_Core_Controller_Varien_Action。在此类中,您将找到preDispatch()方法,该方法在实际分派方法之前为每个控制器操作方法触发。在源代码的这一部分中,将调用Magento的自动加载器类Varien_Autoload来加载特定的编译范围文件。

 Mage::dispatchEvent('controller_action_predispatch', array('controller_action'=>$this));
        Mage::dispatchEvent(
            'controller_action_predispatch_'.$this->getRequest()->getRouteName(),
            array('controller_action'=>$this)
        );
        Varien_Autoload::registerScope($this->getRequest()->getRouteName()); // right here
        Mage::dispatchEvent(
            'controller_action_predispatch_'.$this->getFullActionName(),
            array('controller_action'=>$this)
        );

在编译模式下运行时,Magento只有一个包含路径(即includes/src/目录),因此可以在第一次尝试时直接找到每个文件。Magento拥有大量文件,可节省大量时间。下面的摘录摘自

app / Mage.php

if (defined('COMPILER_INCLUDE_PATH')) {
    $appPath = COMPILER_INCLUDE_PATH;
    set_include_path($appPath . PS . Mage::registry('original_include_path'));
    include_once "Mage_Core_functions.php";
    include_once "Varien_Autoload.php";
} else {
    /**
     * Set include path
     */
    $paths[] = BP . DS . 'app' . DS . 'code' . DS . 'local';
    $paths[] = BP . DS . 'app' . DS . 'code' . DS . 'community';
    $paths[] = BP . DS . 'app' . DS . 'code' . DS . 'core';
    $paths[] = BP . DS . 'lib';

    $appPath = implode(PS, $paths);
    set_include_path($appPath . PS . Mage::registry('original_include_path'));
    include_once "Mage/Core/functions.php";
    include_once "Varien/Autoload.php";
}

当PHP包含文件时,内容将编译为操作码。每次包含文件时都需要完成此过程。为了进一步提高商店的性能,您可以在服务器上安装APC。APC缓存文件的操作码版本,使其可用于后续请求。因此,在下一个请求时:将从APC缓存中读取文件,而不必再次执行相同的过程并浪费性能。


3

编译器

所有编译器文件都位于includes/“请勿擦拭” .htaccess或“ config.php。如果您查看,config.php则会注意到所有启用/禁用编译器所做的就是删除#两个注释之间的注释define。可以肯定的是,rm -Rf includes/src;rm -Rf includes/stat从Magento根目录开始的简单操作会擦除已编译的数据。

还应考虑将AOE_ClassPathCache与APC一起使用,因为这足以将编译器从等式中删除。

另外,有关该主题的更多讨论:


缓存

这纯粹是根据通过所使用的缓存后端定义的local.xml。如果您使用的是默认的files缓存处理程序,则擦除var/cache,如果是Enterprise ,则擦除var/full_page_cache。如果您使用的是诸如Memcache之类的数据存储,则需要通过Magento Flush Cache Storage或通过某种方式来实现,例如,缓存数据存储区必须清除/擦除其缓存。

关于可能的数据存储的更多详细信息,Magento将Zend_Cache用于其缓存机制。您会注意到与local.xml缓存Xpath有关。


注意

如果您正在运行企业版,则会发现另一个配置文件etc/enterprise.xml是在其中定义FPC的数据存储的位置。

Flush Cache和Flush Cache Storage有什么区别:


0

关于Magento编译器的重要提示。进行编译时,您需要关闭APC之类的内容,因为编译器无法编译APC中的内容,并且会破坏您的编译。对我来说,这意味着在服务器上卸载APC,然后重新启动Apache(httpd)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.