Magento的灵活性带来的负担一例

简介:

Magento的架构设计的非常灵活,官方的考虑是希望架构能够适应可能遇见的所有情况,其中最重要的一部分是EAV模式的设计(也是被很多人又爱又恨的一块)。在实际应用中,每个网站总是有各自实际的固定情况,而不用像官方做产品那样去照顾方方面面,这个时候灵活的架构设计有时候反而会成为系统性能上的负担。不过我给的这个例子不是跟高大上的EAV相关的,也不一定是实际应用中最需要改的位置,只能算是抛砖引玉,给别人也给自己提个醒。

用Magento搭建的卖服装的网站,一般会用可配置商品(Configurable Product)来管理商品,选择颜色和尺码(原生不自带)属性来做配置项。Magento系统的可配置商品理论上可以用三个,四个甚至更多个属性来作为配置项,因此它的代码结构设计上支持可配置商品用无限多个属性配置项,而实际业务中,可配置商品最多会用到两个属性配置项,比如服装类的颜色和尺码(不排除有少数特殊的品类会用到多个,但总归是有限的),这种情况下原生的代码在性能上可能就会成拖后腿的了。

if ($this->_isStrictProcessMode($processMode)) {
                    foreach($this->getConfigurableAttributes($product) as $attributeItem){
                        /* @var $attributeItem Varien_Object*/
                        $attrId = $attributeItem->getData('attribute_id');
                        if(!isset($attributes[$attrId]) || empty($attributes[$attrId])) {
                            $subProduct = null;
                            break;
                        }
                    }
                }

上面这段代码出自Mage_Catalog_Model_Product_Type_Configurable里的_prepareProduct方法,目的是为了在商品加购物车时验证接收的参数中,属性id(比如颜色默认是80)是否与该可配置商品所含有的配置项属性对应。为了取出商品包含的两个属性的id(以颜色和尺码为例),这里使用了getConfigurableAttributes这个方法来动态的从数据库中获取。而事实上,在网站实际运作中,我们后台添加完属性时就已经知道了这俩个属性的id(颜色系统自带,id为80,新增的尺码在我的开发环境里id是133),没有必要再一次从数据库中去获取。

可能有人觉得从数据库获取一下这个数据所带来的负担微不足道,一方面我上面已经提到只是举个例子,做个抛砖引玉,提醒下大家在开发中可以考虑这个优化角度,另一方面,这个例子其实还是特地挑出来的,getConfigurableAttributes这个方法附带连锁的代码有不少,当颜色属性的选项数超过40个时,每次添加购物车时,这段代码会造成多0.4秒的时间消耗(本机开发环境实测),如果颜色和尺码属性各自的选项数量更大时,这段代码所消耗时间还会更长,相比直接硬编码已知的id80和id133,区别已经到了肉眼可见的程度。至于为什么getConfigurableAttributes方法会有这种情况,我这里就不细说了,有兴趣的可以研究下源码。吐舌头

回到主题,Magento的架构设计的很灵活,当你自己的网站在某些方面不需要那么灵活时,适当的改造灵活代码为硬编码,也许刚好就能帮助你解决某个困扰已久的性能瓶颈。以上是我的个人见解,欢迎拍砖。

目录
相关文章
|
12月前
Threejs创建正多边体
这篇文章介绍了在Three.js中创建正多边形体(如正四面体、正八面体等)的方法,包括生成多边形几何体、设置表面材质以及将它们添加到场景中的步骤。
243 1
Threejs创建正多边体
|
3月前
|
Java 数据库连接 API
Java 8 + 特性及 Spring Boot 与 Hibernate 等最新技术的实操内容详解
本内容涵盖Java 8+核心语法、Spring Boot与Hibernate实操,按考试考点分类整理,含技术详解与代码示例,助力掌握最新Java技术与应用。
111 3
|
10月前
|
机器学习/深度学习 人工智能
DiTCtrl:腾讯推出多提示视频生成方法,通过多个提示生成连贯的视频内容,确保内容与提示一致
DiTCtrl 是一种基于多模态扩散变换器(MM-DiT)架构的多提示视频生成方法,能够在无需额外训练的情况下,实现多个文本提示之间的连贯视频生成,并保持内容和运动的一致性。
158 1
DiTCtrl:腾讯推出多提示视频生成方法,通过多个提示生成连贯的视频内容,确保内容与提示一致
|
安全 网络安全 开发者
OpenWRT搭建个人web站点并结合内网穿透实现公网远程访问
OpenWRT搭建个人web站点并结合内网穿透实现公网远程访问
516 0
|
JavaScript 前端开发 编译器
纯前端如何实现批量dom转图片,并下载成压缩包
【8月更文挑战第22天】纯前端如何实现批量dom转图片,并下载成压缩包
399 0
|
安全 IDE Java
Spring高手之路10——解锁Spring组件扫描的新视角
这篇文章详细讲解了Spring包扫描的各种特性和策略,包括基础的包扫描路径设置,按注解过滤,正则表达式过滤,Assignable类型过滤,以及自定义过滤等多种过滤策略。同时,文章还深入分析了Spring是如何生成默认bean名称的源码,并介绍了Java的内省机制在生成默认bean名称中的应用。这篇文章为你成为Spring高手打下坚实的基础。
407 1
Spring高手之路10——解锁Spring组件扫描的新视角
halcon基础系列之几何工具相关算子
halcon基础系列之几何工具相关算子
456 0
|
编译器 C语言
【柔性数组】0长度数组,可变数组
【柔性数组】0长度数组,可变数组
|
存储 运维 算法
PolarDB-X 一致性共识协议 (X-Paxos)
近几年NewSQL和云原生数据库的不断兴起,极大地推动了关系数据库和一致性协议的结合,PolarDB-X也是在这样的背景下应运而生。
2201 0
PolarDB-X 一致性共识协议 (X-Paxos)
递归工作栈(Recursive Workstation Stack)
递归工作栈(Recursive Workstation Stack)是一种在计算机程序中实现递归计算的机制,通过使用栈来跟踪递归调用的过程,从而实现对复杂问题的求解。递归工作栈在解决具有自相似结构的问题时非常有用,例如计算斐波那契数列、解决迷宫问题等。
428 9