magento -- 给Magento提速之缓存上的探索
依然在为Magento提速做努力,除了自带的缓存和编译,之前的所作的很多努力都是从减少JS,Css,图片等载入时间入手,而对页面载入耗时最早有时也是最大的一部分--获取页面数据没有做太多处理,以gap.cn为例,用firebug看下各个请求的耗时(数据受多方面因素影响,仅供参考):
可以看到js和css的载入时间一般是以几十毫秒来计算的,而载入的第一步页面数据却要花掉将近一秒,在用各种方法缩短js,css和图片的载入时间后,想要让Magento跑的更快,就得想办法从缩短这“781ms”处下手。
因为Magento复杂的代码架构和EAV模式的数据库,导致每次页面载入都要读取大量的php文件和大量的数据表,自带的缓存将一些常用的数据缓存到了文件里,而不需要每次都去读取数据库,这提醒了我们一种思路,就是将页面上常用的数据都缓存起来,减少读取php文件和数据库的需要。不记得在哪里看到过一篇文章提到,Magento自带的缓存方案相当保守,缓存的数据很少,页面载入时依然要从数据库读取大量的数据。我们所要做的就是改进缓存的方案,将更多数据缓存到文件中去。
我对缓存的研究不是很深,个人理解大概分两种,一种是整页缓存,一种是局部缓存,以我测试过的两个缓存插件为例阐述下观点。
第一个插件是一个整页缓存的插件--Performance Booster,官网上的地址是http://www.magentocommerce.com/magento-connect/AITOC,+Inc./extension/4865/performance_booster,这个插件开启后,会在前台每访问一个页面后就生成一个静态html,下次再访问相同页面时会直接读取静态文件的内容,速度提升相当明显,能将第一步html的载入时间从几百毫秒直接提升到几十毫秒。这个插件的代码里监听了一大堆事件,用来刷新缓存,比如后台修改产品信息后保持的时候会刷新对应的缓存。
按说这个插件已经将可能需要刷新缓存的状况都考虑到了,但我在使用的时候却遇到了麻烦。因为Magento是个高度开放的系统,可以安装各种各样的第三方插件,也可以自己写一些新模块进去。插件不可能考虑到除了系统自带模块以外需要刷新缓存的情况,这就导致了页面某些部分在后台数据已经改变的情况下前台没有刷新或者有一些功能块直接出现异常无法使用。而我所经手的项目大多都装有不少插件,以及自己所做的修改,所以很难有机会用上这个插件了。
第二个插件是一个免费插件--CatalogCache,官网上的地址是http://www.magentocommerce.com/magento-connect/netresearch/extension/2138/catalogcache,这个插件功能很简单,就是缓存了Catalog/Product_View和Catalog/Product_List这两个block的数据,对页面上来说,也就是缓存了产品列表页的产品数据和产品详细页的产品数据,只缓存局部,而不是整个页面。经测试,在产品数比较多的列表页和产品页,开启这个插件后能带来大概100ms--到200ms不等的速度提升。因为只缓存了两个block,所以插件也只对列表页和产品页起效果。
这个插件功能简单,针对性强,所以也不用担心会对列表页和产品页以外的东西造成影响,经过一段时间测试没问题后已经用在了正式的项目上。当然推荐这个插件并不是这篇文章的主要目的,而是这个插件让我觉得用同样的方式给各种常用block写缓存是种安全而又实用的方式,虽然效果上肯定比不上直接读静态文件来得快,但因为是自己一块块写的,不需要担心整页缓存时会有哪一块遗漏了没有照顾到。也就是说,不管你添加了多少第三方插件,或者自己写了多少功能,依然可以用这种方式来做优化,自己选择性的给局部做缓存。
得出我自己的观点,整页缓存的适应性不够好,无法应对各种不同的项目情况,如果你的Magento站只是在默认功能上套了个模板,可以尝试下第一个插件,如果项目有不少第三方插件,甚至做了不少二次开发,那么就放弃整页缓存方案。所以局部缓存才是我认为最适合Magento的方案,虽然效果比不上整页缓存,但胜在灵活,安全,适应性强。
个人肤浅的观点,欢迎拍砖!
magento -- 给Magento提速之缓存上的探索的更多相关文章
- magento currency magento头部增加币种切换选择
magento currency magento头部增加币种切换选择 默认magento 货币选择切换是显示在左边 有时候我们需要让其显示在头部 Step 1. Create a new file a ...
- JuiceFS 在数据湖存储架构上的探索
大家好,我是来自 Juicedata 的高昌健,今天想跟大家分享的主题是<JuiceFS 在数据湖存储架构上的探索>,以下是今天分享的提纲: 首先我会简单的介绍一下大数据存储架构变迁以及它 ...
- 涂鸦基于OAuth2在开发者平台上的探索与实践
前言 开发授权(OAuth2)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资料(如照片.视频.联系人列表),而无需将用户名和密码提供给第三方应用. OAuth2允许用户提供一 ...
- magento -- 如何在magento中进行产品的批量上传
花费了好多时间,阅读了magento官方论坛上几乎所有的批量上传产品的相关帖子,分析了大量相关magento代码,终于可以完全实现指产品批量上传的功能,免除网速慢,在页面之间跳来跳去,以及重复输入数据 ...
- magento -- 解决magento错误:ERROR: Base table or view already exists: 1050 Table ... already exists
相信有更新magento或者,备份转移magento站点的时候可能会碰到类似这样的错误提示: Base table or view already exists: 1050 Table ... alr ...
- HTML 5 应用程序缓存(上)
什么是应用程序缓存(Application Cache)?HTML5 引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问. 应用程序缓存为应用带来三个优势: 离线浏览 ...
- NHibernate系列文章九:NHibernate对象二级缓存上
摘要 NHibernate的二级缓存由SessionFactory管理,由所有Session共享. NHibernate缓存读取顺序: 首先从一级缓存中读取,如果一级缓存对象存在,则读取一级缓存对象并 ...
- magento cache,magento index
"Magento后台作修改,Magento前台没变化""Magento属性更新了,Magento前台没反应"如果你碰到了以上两种情况,或者看到截图中的提示: 您 ...
- 带着新人学springboot的应用01(springboot+mybatis+缓存 上)
上一篇结束,第一次做一个这么长的系列,很多东西我也是没有说到,也许是还没有想到,哈哈哈,不过基本的东西还是说的差不多了的.假如以后碰到了不会的,随便查查资料配置一下就ok. 咳,还有大家如果把我前面的 ...
随机推荐
- c++ 多继承 public
以下代码会报错 #include <iostream> using namespace std; class Sofa { public: Sofa(); ~Sofa(); void si ...
- Ubuntu14.04 server (amd64)修改源
1.备份原来的源文件 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 2.修改源 sudo vi /etc/apt/sources.li ...
- 《剑指offer》第十七题(打印1到最大的n位数)
// 面试题17:打印1到最大的n位数 // 题目:输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则 // 打印出1.2.3一直到最大的3位数即999. #include <ios ...
- Codeforces 38B - Chess
38B - Chess 思路:懂点象棋的规则就可以,看看哪些点可以放马. 代码: #include<bits/stdc++.h> using namespace std; #define ...
- DOM文档对象模型
- OAF中为MessageTextInput添加加事件处理
需求:现在OAF页面上有俩输入框,单价,数量,根据单价数量,自动计算MessageStyledText金额中的值,对应的基于EO的VO的字段为UnitPrice,Quantity,Total. 实现方 ...
- win10激活工具---KMSAutoNet
win10激活工具---KMSAutoNet 1> 2> 3> 4> 5> 6> 8>
- shell 命令参数
$# 是传给脚本的参数个数$0 是脚本本身的名字$1 是传递给该shell脚本的第一个参数$2 是传递给该shell脚本的第二个参数$@ 是传给脚本的所有参数的列表$* 是以一个单字符串显示所有向脚本 ...
- zookeeper server处理客户端命令的流程
zk server处理命令涉及到3个类,2个线程:一个命令请求先后经过PrepRequestProcessor,SyncRequestProcessor,FinalRequestProcessor. ...
- SQL触发器实例(上)
--1.) 创建测试用的表(testTable) if exists (select * from sysobjects where name='testTable') drop table test ...