本文的重点是大家详细介绍了Drupal7的drupal_static函数的用法,有需要的盆友可以参考一下。
Drupal7很强,实力的重点之一就是实体领域。比如节点/分类术语/用户都是实体,适用于字段,即客户可以随便给节点/分类术语/用户增加新的字段;
强势的背后是业绩的隐忧;如果添加的节点中有10个字段,则匹配10个表来加载字段数据信息,而不是一列,这导致至少10个连接来查询一个节点。这对数据库查询的性能是极其有害的,甚至是致命的;设想一个网页有10个块,每个块包含10个节点,每个节点有10个字段,那么查询表的频率是10次(应用entity_load_multiple),加入的频率是100次;
这个问题基本上没有立竿见影的办法。毕竟这是Drupal。
这里给大家展示一个性能提升的小方法,就是使用drupal_static函数。这种优化方法是PHP级别的,你必须掌握基本的PHP专业知识。
这个函数可以缓存文件函数实现的结果,保证函数实现撤回后结果保存在运行内存中。然而,与memcache不同,它会在请求完成后自动释放。
这里有一个例子:
目前网页上有两个区块:last_news区块和last_comment区块。内容规定是last_comment必须是10,第一条是last_news评论。如果还不够,按时间顺序去掉除last_news评论以外的项目。
分析之下,last_news块维护last_news数据信息,在last_comment中也需要这个数据信息,假设有一个方法可以调用它:news_last_news_data()返回这个last_news,
函数原型:
复制以下代码:函数news_last_news_data();
必须启用两次,所以数据库查询也必须查询两次,相对连接问题也会凸显出来。在并发的情况下,比如20,那么在数据库查询方面会有20个查询,工作压力还是有点吓人的。VPS在2GB运行内存中应该承受不了这种高并发;
我该怎么办?我们需要降低数据库查询的要求。经过分析我们可以看到,news_last_news_data()并没有使用主参数,它的作用只是查询。我们可以判断,每次启用,结果都一样。那么有什么办法可以缓存文件查询结果呢?
是啊!Drupal_static在这里。
看下面这段伪代码:
复制代码如下:FUNCTIONnews_last_news_data(){
$last_news=&Drupal_static(__FUNCTION__,array());
if(empty($last_news)){
//那么你可以在这里查询
$last_news=query();
}
return$last_news;
}
分析以下内容:
在第一行中,我启用了drupal_static()方法。第一个主参数是一个键,这个键是唯一的键。这里拼写变量定义__FUNCTION__表示 *** 作方法名是key,第二个主参数是初始值。当没有缓存文件时,应该使用空数组。
在第二行中,您添加了一个歧视。如果$last_news的缓存文件已经存在,则不执行查询,这样会使这个查询的工作压力减少一半。我们来跑一下,看看速度是不是很高!
后面的代码你应该看得懂!
这里还要注意:php5.1.13有一个BUG,在整个应用过程中都会遇到。意思是当使用use关键字启用隐名方法顶层的自变量,并且这个自变量来自于drupal_static的返回值时,隐名方法实现后顶层自变量的引入会发生变化,即这个自变量是后来引入的,所以这个自变量及其值不是drupal_static的返回值。这个BUG很复杂。我们来看看遇到后是否应用密名法。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)