colinmollenhour/cache-backend-file

标准Zend_Cache_Backend_File后端在按标签清理时的性能极差,使得随着缓存项目数量的增加而变得不可用。此后端进行了许多更改,从而实现了巨大的性能提升,尤其是在标签清理方面。

安装次数: 17,659,644

依赖项: 7

建议者: 0

安全: 0

星星: 144

关注者: 21

分支: 35

开放性问题: 2

类型:magento-module

v1.4.8 2023-09-19 20:23 UTC

This package is auto-updated.

Last update: 2024-09-19 23:23:00 UTC


README

标准的Zend_Cache_Backend_File后端在按标签清理时的性能极差,使得随着缓存项目数量的增加而变得不可用。此后端进行了许多更改,从而实现了巨大的性能提升,尤其是在标签清理方面。

此缓存后端通过在文件中索引标签来工作,这样标签操作就不需要扫描每个缓存文件。ID以追加模式写入标签文件,并且只有在文件超过4k时才会随机压缩标签文件,以防止边缘情况下的无限增长。

元数据和缓存记录存储在同一个文件中,而不是单独的文件,从而减少了inode的数量和文件stat/read/write/lock/unlink操作的数量。此外,由于adler32哈希算法和前缀,原始的散列目录结构分布非常差。多级嵌套目录已被替换为单级嵌套,由多个字符组成。

改进是否显著?当然。标签清理的速度实际上快了数千倍,加载速度快了一倍,而保存速度略慢,取决于要保存的标签数量。

使用Magento Cache Benchmark自己测试一下。

安装

  1. 使用Composer安装:composer require colinmollenhour/cache-backend-file
  2. 编辑app/etc/local.xml,将global/cache/backend更改为Cm_Cache_Backend_File(Magento 1 / OpenMage)
  3. 删除缓存目录的所有内容

示例配置

<config>
    <global>
        <cache>
            <backend>Cm_Cache_Backend_File</backend>
        </cache>
        ...
    </global>
    ...
</config>

默认情况下,Cm_Cache_Backend_File配置为使用chmod设置文件权限。正确设置文件权限的方法是尊重umask并设置任何权限。这样,文件权限可以按照操作系统约定正确继承。为了提高安全性,应正确设置umask。在Magento中,umask在index.php中设置为0,这意味着没有限制。例如,为了使文件和目录不再公开,请将umask(0007)添加到Mage.php

如果umask太复杂,您更愿意使用次优(不安全,不必要的系统调用)的方法,则可以启用以下所示的旧版chmod使用。这将强制设置文件模式,而不管umask如何。

<config>
    <global>
        <cache>
            <backend>Cm_Cache_Backend_File</backend>
            <backend_options>
                <use_chmod>1</use_chmod>
                <directory_mode>0777</directory_mode>
                <file_mode>0666</file_mode>
            </backend_options>
        </cache>
        ...
    </global>
    ...
</config>

对于directory_mode,可以使用2设置第四位数字的setgid位。例如,02770。这将导致具有setgid位的目录中创建的文件和目录继承父目录的相同组,这对于以除了您的web服务器用户之外的用户运行脚本很有用。setgid位也可以与默认配置(use_chmod关闭)一起使用,只需一次在var/cache目录上设置位即可使用chmod g+s var/cache

请注意,以root身份运行cron作业并不是从安全角度出发的良好做法。

清理旧文件

Magento和Zend_Cache不会自动清理旧记录,因此如果您想保持缓存目录整洁,需要编写并定期调用自己的脚本清理旧数据。以下是一个针对Magento的示例:

<?php PHP_SAPI == 'cli' or die('<h1>:P</h1>');
ini_set('memory_limit','1024M');
set_time_limit(0);
error_reporting(E_ALL | E_STRICT);
require_once 'app/Mage.php';
Mage::app()->getCache()->getBackend()->clean(Zend_Cache::CLEANING_MODE_OLD);
// uncomment this for Magento Enterprise Edition
// Enterprise_PageCache_Model_Cache::getCacheInstance()->getFrontend()->getBackend()->clean(Zend_Cache::CLEANING_MODE_OLD);

开发

请随时发送Pull Requests,将您的改进回馈给社区!

您只需安装Docker即可在本地运行单元测试,使用简单的别名即可。

alias cm-cache-backend-file='docker run --rm -it -u $(id -u):$(id -g) -v ${COMPOSER_HOME:-$HOME/.composer}:/tmp -v $(pwd):/app --workdir /app cm-cache-backend-file'
docker build . -t cm-cache-backend-file

然后,安装Composer依赖项,按照以下方式运行测试:

  cm-cache-backend-file composer install
  cm-cache-backend-file composer run-script test
  cm-cache-backend-file composer run-script php-cs-fixer -- --dry-run

特别感谢

感谢Vinai Kopp,您的symlink实现激发了这个后端的灵感!

@copyright  Copyright (c) 2012 Colin Mollenhour (http://colin.mollenhour.com)
This project is licensed under the "New BSD" license (see source).