1

Magento 有一个回退机制,通过一组定义的路径检查预期文件的存在,帮助防止错误和主题问题。它是这样实现的

/**
 * Check for files existence by specified scheme
 *
 * If fallback enabled, the first found file will be returned. Otherwise the base package / default theme file,
 *   regardless of found or not.
 * If disabled, the lookup won't be performed to spare filesystem calls.
 *
 * @param string $file
 * @param array &$params
 * @param array $fallbackScheme
 * @return string
 */
protected function _fallback($file, array &$params, array $fallbackScheme = array(array()))
{
    if ($this->_shouldFallback) {
        foreach ($fallbackScheme as $try) {
            $params = array_merge($params, $try);
            $filename = $this->validateFile($file, $params);
            if ($filename) {
                return $filename;
            }
        }
        $params['_package'] = self::BASE_PACKAGE;
        $params['_theme']   = self::DEFAULT_THEME;
    }
    return $this->_renderFilename($file, $params);
}

作为 Magento 主题开发人员,您有两个选择:您可以尽可能少地添加到新主题并依赖回退,或者您可以将回退主题中的所有内容复制到新主题中并修改它(在这种情况下,回退有在找到目标之前迭代更少的文件)。推荐前一种方法。后者不是。

复制这些文件肯定很麻烦,但另一方面,回退似乎应该相当昂贵,特别是如果(作为一个优秀、精明的编码器)您确保尽可能多的文件回退。所以我发现自己想知道如果我采取措施尽量减少发生的回退量,Magento 网站是否会表现得更好。

我在网上搜索过,但没有找到关于这个问题的任何信息,而且我对 Magento 还不够熟悉,无法自己描述回退。有没有关于这个回退机制的实际性能成本的任何信息?

4

2 回答 2

4

性能成本为 37。

不那么刻薄:不幸的是,您的问题无法回答。虽然(显然)声明这些文件和目录会产生性能成本,但 Magento(和任何 LAMP 应用程序)将由于 SQL 开销和 CPU 比其他因素更快地遇到性能瓶颈。现代 Web 应用程序的性能调整往往不会发生在应用程序级别,而是将应用程序视为不可更改的 blob 并购买/配置最佳的硬件设置。

如果有人对 Magento 进行了启用或关闭后备的基准测试,他们并没有公开分享这些信息。

于 2012-01-11T17:00:53.750 回答
0

有性能成本,但正如 Alan 所说,这将更多地取决于您的服务器架构而不是应用程序。

值得注意的是,Magento 也有代码文件的后备机制,这也可能会花费您宝贵的毫秒时间。与主题后备不同,有一个解决方法。Magento 称其为“编译器”。

通常,在请求加载类时,自动加载器会在四个位置查找合适的 PHP 文件:app/code/localapp/code/communityapp/code/core,最后是lib。如果您想用自己的版本重载某些核心代码,这很有用,但由于文件系统中散布着大量类,所以速度很慢。

因此 Magento 编译器确保自动加载器只需要查看包含/src并且会打开更少的文件。

从理论上讲,这应该没有太大的区别,因为您的服务器应该缓存这些文件,但是您必须阅读完整的文章才能理解为什么它不是那么简单。

http://www.byte.nl/blog/should-i-use-the-magento-compiler

轶事证据:在一个拥有大量 3rd 方模块的商店中,我们看到第一个字节的时间从 ~2 秒下降到 ~1.6 秒,仅通过启用编译。

警告词:某些 3rd 方模块未正确构建,并且在启用编译时会导致整个存储中断。通常这是因为他们试图include_oncerequire_once某些具有相对路径的文件,并且它不起作用,因为启用编译时文件位于不同的目录中。

于 2016-05-05T20:37:35.067 回答