Drupal7之drupal_static函数用法解析

所属分类: CMS教程 / drupal 阅读数: 977
收藏 0 赞 0 分享

Drupal7 非常强大,其强大核心之一是entity field模式,比如node/taxonomy term/ user 都是一种entity, 并且支持field模式,也就是用户可以随意的添加新的field给node/taxonomy term/user;

强大的背后是性能的担忧;加入node有10个field,那么就对应10个表来装载field数据,而不是一个列,这就导致了至少10个join 去查询一个node. 这对数据库的性能影响是巨大,甚至是致命的;试想,如果一个页面有10个block, 每个block包含10个node, 每个node有10个field, 那么查询表的次数就是10次(使用entity_load_multiple),join的次数是100次;

我们几乎没有直接的办法解决这个问题,毕竟这就是Drupal.

在这里我们提供一个小的性能优化办法,即使用drupal_static函数,这个优化方法是PHP级别的,需要了解基本的PHP知识。

这个函数可以缓存函数执行结果,保证在函数执行退出后,结果存在内存中,但是又不同于memcache,它在一个请求结束后就自动释放。

这里举个例子:

现在有这样子的需求,页面上有2个block: last_news block, last_comment block,内容要求是last_comment 需要10条,首先取last_news 的comment, 如果不足,则按照时间先后顺序取出除了和last_news comment 匹配的项;

分析下,last_news block保护了last_news 数据,在last_comment 也需要这个数据,假设有方法叫: news_last_news_data() 返回这个last_news,

函数原型:

复制代码
代码如下:
function news_last_news_data();

则需要调用2次,那么数据库也需要查询2次,相对的JOIN问题也会凸显,在并发量情况下,比如20,那么数据库来说就有20次查询,压力还是有点的怕,在1G内存下VPS应该是撑不住这个并发了;

怎么办?我们要减少数据库的请求,分析,我们看到news_last_news_data()不需要参数,功能也就是查询而已,我们断定每次调用返回的结果都是一样。那么我们有没有办法缓存查询结果?

有! drupal_static来了.

看下面伪代码:


复制代码
代码如下:
function news_last_news_data() {
$last_news = &drupal_static(__FUNCTION__, array());
if (empty($last_news)) {
// 那么我们在这里就查询
$last_news = query();
}
return $last_news;
}

分析如下:

第一行,我调用了drupal_static()方法,第一个参数是一个key, key是唯一键,这里使用魔法常量__FUNCTION__表示, 代表着使用方法名作为key, 第二个参数是默认值,当缓存不存在的时候使用一个空的数组替代

第二行,我加了一个判断,如果$last_news缓存已经存在,则不执行查询,这样就减少了这个查询的一半的压力,运行一下,速度是不是很块!

后面的代码你应该懂了吧!

此处还要注意:在php5.1.13有一个BUG, 也是我使用过程中遇到的,意思是当在匿名方法里面使用use关键字调用匿名方法上层的变量,且这个变量是来自drupal_static的返回值,那么匿名方法执行完后,会修改上层的变量的引用,也就是在后面引用到这个变量,那么这个变量以及不是drupal_static的返回值,所以缓存会失效。这个BUG说的很复杂,遇到后就看看是否使用了匿名方法吧。

更多精彩内容其他人还在看

drupal的url传值和表单传值分析

这篇文章主要为大家介绍了drupal的url传值和表单传值,以实例形式较为详细的分析了drupal的URL传值与表单传值的具体实现方法,是采用drupal建站中非常实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

Drupal7的cache缓存开发实例教程

这篇文章主要为大家介绍了Drupal7的cache缓存开发的方法,可以有效的缓解网站的访问压力,是进行drupal建站中非常实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

自定义drupal注册表单的方法

这篇文章主要为大家介绍了自定义drupal注册表单的方法,通过user钩子实现对用户注册信息项的灵活控制,是进行drupal建站时非常实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

drupal内的表格化输出实现方法

这篇文章主要为大家介绍了drupal内的表格化输出实现方法,涉及drupal内置函数的使用及相应的数据库操作技巧,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

批量导入XML数据到drupal系统的方法

这篇文章主要为大家介绍了批量导入XML数据到drupal系统的方法,主要通过一个XML文件导入类来实现这一功能,是非常实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

drupal常用判断函数汇总

这篇文章主要为大家介绍了drupal常用判断函数,实例汇总了判断首页、判断用户角色、判断权限等常用函数,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

drupal输出用户头像地址的方法

这篇文章主要为大家介绍了drupal输出用户头像地址的方法,对比了错误与正确的实现方法,分析了drupal输出用户头像地址的技巧,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Drupal CMS可以制作的16种类型网站

真是不看不知道,Drupal 真奇妙。很多使用CMS内容管理系统的人可能都会知道一款国外的CMS系统:Drupal 。在我们传统的想象中CMS除了能做内容文章站外,其他还有图片站,分类信息站等,到底这个CMS能做多少种类型的网站呢?
收藏 0 赞 0 分享

Drupal 启用缓存和Gzip压缩设置方法

对页面和静态资源的启用缓存和Gzip压缩传输.
收藏 0 赞 0 分享

drupal 自定义表单调用autocomplete主标签实现代码

drupal 自定义表单调用autocomplete主标签实现代码,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多