colinmollenhour / cache-backend-file
标准Zend_Cache_Backend_File后端在按标签清理时的性能极差,使得随着缓存项目数量的增加而变得不可用。此后端进行了许多更改,从而实现了巨大的性能提升,尤其是在标签清理方面。
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.4
- phpunit/phpunit: ^9
- zf1s/zend-cache: ~1.15
README
标准的Zend_Cache_Backend_File
后端在按标签清理时的性能极差,使得随着缓存项目数量的增加而变得不可用。此后端进行了许多更改,从而实现了巨大的性能提升,尤其是在标签清理方面。
此缓存后端通过在文件中索引标签来工作,这样标签操作就不需要扫描每个缓存文件。ID以追加模式写入标签文件,并且只有在文件超过4k时才会随机压缩标签文件,以防止边缘情况下的无限增长。
元数据和缓存记录存储在同一个文件中,而不是单独的文件,从而减少了inode的数量和文件stat/read/write/lock/unlink操作的数量。此外,由于adler32哈希算法和前缀,原始的散列目录结构分布非常差。多级嵌套目录已被替换为单级嵌套,由多个字符组成。
改进是否显著?当然。标签清理的速度实际上快了数千倍,加载速度快了一倍,而保存速度略慢,取决于要保存的标签数量。
使用Magento Cache Benchmark自己测试一下。
安装
- 使用Composer安装:
composer require colinmollenhour/cache-backend-file
- 编辑
app/etc/local.xml
,将global/cache/backend
更改为Cm_Cache_Backend_File
(Magento 1 / OpenMage) - 删除缓存目录的所有内容
示例配置
<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).