在Drupal中缓存

时间:2020-03-05 15:25:30  来源:igfitidea点击:

Drupal包含多个执行层,显然从动态PHP代码中呈现内容要花费大量时间。
缓存是最大化Drupal性能的关键技术。
在Drupal中采用缓存机制之前,必须考虑站点的类型和访问站点的用户的类型。
并不是所有的站点都有相同的缓存机制。

缓存技术可以根据缓存的数据类型和受影响的用户在不同的级别上进行分类。
Drupal可以有两种用户。

  • 匿名用户
  • 验证用户组

提供给匿名用户HTML页面都是相同的,但是提供给经过身份验证的用户HTML页面具有个性化的内容(例如,欢迎<user name>)。
基本上,可以通过为匿名用户缓存HTML输出来实现非常高的速度。
现在让我们看看在Drupal中缓存的各种方法。

Drupal内部缓存

Drupal内部有一个缓存机制,我们可以很容易地利用它。
存储在缓存表中的数据可以以更高的速度获取。
Drupal内部缓存可以与首选缓存后端集成,而不是与默认的cache DB表集成。
Drupal缓存设置列在其性能页中。
它包含以下选项:

  • 为匿名用户缓存页面:启用此选项可为匿名用户激活整页缓存。
  • Cache blocks:启用这个选项来缓存Drupal块(还要记住,页面缓存将忽略块缓存)。
  • 最小缓存生存期:这个值经常被误解。它不仅指示应该删除缓存的时间。它应该伴随一个缓存清除事件。
  • 缓存页过期:这是指外部缓存可以使用旧版本页的最长时间。这与Drupal的内部缓存表无关。

始终建议在生产站点中启用Drupal内部缓存。

使用Drupal的缓存API定制缓存

Drupal核心提供了cacheapi来将数据保存在缓存表中。
这有助于我们直接从PHP代码中保存数据。
大量数据可以存储在专用的缓存表中。
例如,视图模块使用缓存视图和缓存视图数据来存储数据。

cache API的主要功能:

cache_set($cid, $data, $bin = 'cache', $expire = CACHE_PERMANENT)
cache_get($cid, $bin = 'cache')
cache_clear_all($cid = NULL, $bin = NULL, $wildcard = FALSE)

$cid(cache ID)唯一地标识{cache}表中的缓存元素。
如果$wildcard boolean设置为TRUE,则删除以$cid(string)开头的所有缓存id。

Drupal视图缓存:

Drupal的视图模块将数据存储在自己的专用表{cache_views}和{cache_views_data}中。
默认情况下,缓存处于关闭状态,并且可以在每个视图显示的"高级选项"下启用缓存。
它允许我们为每个视图显示缓存查询结果和渲染输出。
如果生成一个块,可以将其公开给Drupal的内置块缓存。
它还揭示了Drupal块缓存的类型,如每用户、每页、每角色的缓存等。

内存缓存

Memcache是一种将外部数据源(数据库或者API)中的对象缓存在内存中的技术。
它有助于减少数据库负载,而且通常要快得多。
Memcache通常有助于为经过身份验证的用户加速站点。

它需要一个名为"memcached"的守护进程/服务(请参阅memcached.org)以及使用此服务的PHP扩展。

有两个PHP扩展可以使用这个服务"memcache"和"memcached"(不要和前面提到的memcached守护进程混淆)。
不建议将Memcache用于共享主机服务器。

Drupal的memcache模块提供了Drupal和memcached之间的集成。
此外,我们需要将memcached设置为Drupal的缓存后端,以便开始将memcached与Drupal的缓存系统集成。
这是用Drupal的设置.php

$conf['cache_backends'][] = 'sites/all/modules/memcache/memcache.inc';
$conf['cache_default_class'] = 'MemCacheDrupal';
$conf['cache_class_cache_form'] = 'DrupalDatabaseCache';
$conf['memcache_key_prefix'] = 'unique_key'; /*Multisite installation*/

操作码缓存

PHP有几个添加组件可以将程序代码转换为内存(字节码)。
可以缓存该字节码以跳过下一个请求的解析和编译。
它将缩短加载时间并减少CPU使用。
这种技术称为操作码缓存。

APC(可选PHP缓存)是PHP执行操作码缓存的常见插件。
它还支持用户缓存。
它在服务器级别运行,不能在共享主机服务器上运行。

Zend Opcache是PHP的另一个插件。
它默认在phpv5.5+上编译。
它比APC有更多的高级特性,但不支持用户缓存。
如果我们想利用APC的用户缓存,可以安装名为APCu的扩展。

反向代理-清漆

Varnish是一种先进且非常快速的反向代理系统。
(请参阅此问题了解反向代理是什么)

Varnish充当用户和web服务器之间的中介。
当Varnish收到来自用户的页面请求时,它将首先检查该特定页面的内部缓存。
如果找到它,它可以从自己的缓存中更快地服务,否则它会将请求转发到原始web服务器。

Varnish只能处理静态文件和匿名页面视图。
Drupal的varnish模块提供了Drupal和VarnishHTTP加速器之间的集成。
另外,我们需要将Varnish设置为Drupal的缓存后端(请参阅Varnish项目页面)。
我们还需要配置Varnish来告诉它应该其中监听web服务器。
这是通过/etc/varnish中的以下代码片段完成的/默认.vcl

backend default {
  .host = "127.0.0.1";
  .port = "8000";
}

注意:Drupal的性能页面中的"页面缓存生存期"选项用于定义Varnish缓存过期日期。
Drupal的expire模块可用于使Varnish缓存中的url过期。

促进

Drupal的boost模块提供了静态页面缓存,类似于Varnish。
在用户请求时,它可以服务于.html或者.html,而不是从PHP重新生成页面。
html.gz页面直接从静态磁盘文件。
它通过修改.htaccess和机器人.txt文件夹。
直接从boost提供的页面将在html代码的末尾包含一个简短的标记信息,如

<!-Boost缓存的页面@2012-03-05 10:55:30,过期时间@2012-03-05 16:55:30-->

Boost模块支持crawler(自动为过期页面重新生成url)。
它在共享主机环境中运行良好。
许多Drupal用户报告说,将Memcached(用于经过身份验证的页面视图)和Boost(用于匿名页面视图)结合使用是成功的。

内容交付网络(CDN)

CDN是一个地理分散的网络,它存储的内容离用户更近。
它本质上减少了最终用户和服务器之间的延迟。

Drupal的cdn模块为Drupal站点提供了简单的内容交付网络集成。
它改变文件的网址,使文件下载从CDN而不是web服务器。

与其他缓存选项不同,CDN总是需要另外的财务成本。

总结

在Drupal中有几种技术可以执行缓存。
有效地使用这些方法可以提高站点性能。
糟糕的缓存配置可能会造成负面影响。
通常,我们可以通过为特定尝试服务器资源来找出最佳的缓存配置。

如果我们有专用服务器,则可以使用Varnish为匿名用户利用整页缓存;如果我们在共享服务器上,则可以使用Boost。
APC(操作码缓存)通常有助于更好的低级别性能调整。
通过身份验证的用户可以使用Memcache来减少数据库的负载。

Drupal8性能提升:在Drupal7中,删除特定的缓存项、清除整个缓存箱或者使用基于前缀的无效化都是可能的。
这意味着如果修改一个节点,就不能精确地将包含该节点的所有缓存项作为目标。
但是,Drupal8(引入了缓存标记)具有更精确的缓存失效。
每个缓存项可以有多个缓存标记。
这有助于我们更精确地确定要删除的缓存项的目标,并明显提高缓存命中率。