如今,如果您要与全球受众打交道,即使有几分钟的时间,您也无法脱机,因为这使您的竞争对手有机会证明他们领先于您。
如果您要处理Web开发,则缓存是一个重要因素。 它确实有助于减轻Web服务器为同时处理数千个请求(即使不是数百万个请求)而要做的繁重工作。 如今,有很多可用的选项可以提高Web应用程序的性能,但是缓存的基本概念保持不变。
缓存的目的
只需要构建一个包含几个页面的静态HTML网站的日子已经一去不复返了。 在那种情况下,您不必担心网站上的并发请求和大量流量,因为与那些需要大量服务器资源来构建的动态网页相比,发送这些静态HTML页面要快得多他们自己。
从查询数据库到从第三方服务提供商获取数据,典型的动态页面会发挥很多作用。 要显示一个包含大量不同格式信息的页面,需要花费很多时间。 具体来说,随着流量的增加,您无力查询数据库来为每个请求获取相同的复杂信息。 它将很快使您的服务器拥挤不堪的资源,在您不能做某事之前,它们将不复存在!
因此,您需要介于两者之间的某些东西来加快处理速度,而这正是缓存进入图片的地方。 缓存的想法非常简单-您可以将计算/格式化的结果存储在某个地方,并在需要时提取它们,从而不必再次进行处理。 “某个地方”可能在任何地方:文件系统,内存或数据库本身。
此外,还有许多可用于缓存的选项-内存缓存,Redis,Varnish等。 您可以根据需要使用它们,有时多个组件的组合也可以帮助成倍地提高性能。
由于将需要一个完整的系列来解释缓存的来龙去脉,而且这超出了本文的范围,因此我们将回到OpenCart上下文并在下一节中继续进行。
我们将使用最新版本的OpenCart,因此请确保已安装该版本以遵循代码。
OpenCart中的基本缓存如何工作
缓存库是在核心本身中提供的,因此让我们直接进行探索。 继续并在您喜欢的文本编辑器中打开system/library/cache.php
文件。
<?php
class Cache {
private $cache;
public function __construct($driver, $expire = 3600) {
$class = 'Cache\\' . $driver;
if (class_exists($class)) {
$this->cache = new $class($expire);
} else {
exit('Error: Could not load cache driver ' . $driver . ' cache!');
}
}
public function get($key) {
return $this->cache->get($key);
}
public function set($key, $value) {
return $this->cache->set($key, $value);
}
public function delete($key) {
return $this->cache->delete($key);
}
}
从构造函数开始,它将初始化在构造函数参数中传递的缓存驱动程序。 如果该类可用于请求的缓存适配器,则将其初始化为$this->cache
属性,否则它将退出并显示错误消息。 我们将在下一部分中看到不同的缓存适配器。
另外,有三个包装器函数,用于执行与缓存有关的所有操作。
get
方法用于从缓存中检索值。
$this->cache->get($key);
set
方法用于将值存储在缓存中。
$this->cache->set($key, $value);
delete
方法用于从缓存中删除键/值映射。
$this->cache->delete($key);
因此,在模块中使用缓存功能也非常简单。
从缓存存储中提取数据的前端有很多地方。 让我们列出其中一些:
- 最新产品
- 畅销产品
- 制造商清单
- 国家名单
- 货币清单
- 区域列表
- 商店设定
对于文件缓存,您将在system/cache
目录下找到所有缓存文件。 尽管OpenCart在适当的事件下会清除缓存,但是您也可以手动清除这些文件以获取最新数据。
就缓存包装器而言,仅此而已。 在下一节中,我们将看到核心中可用的不同缓存适配器以及它们完成的实际工作。
缓存适配器
OpenCart的核心中提供了三个缓存适配器:文件,内存缓存和apc。 OpenCart中使用的默认缓存适配器是file。
这是index.php
的代码片段,该代码使用默认的缓存适配器初始化$cache
对象。
// Cache
$cache = new Cache('file');
$registry->set('cache', $cache);
不幸的是,没有任何可配置的方法可以让您切换缓存适配器,因为它是硬编码的。 话虽如此,您可以使用OCMOD来更改默认的缓存适配器,而无需更改核心文件。
由于每个缓存适配器的实现几乎相同,因此我们仅查看其中一个缓存适配器以了解发生了什么。 让我们以内存缓存为例。 继续并打开system/library/cache/mem.php
。 您也可以在同一目录中浏览另外两个适配器file.php
和apc.php
。
<?php
namespace Cache;
class Mem {
private $expire;
private $cache;
public function __construct($expire) {
$this->expire = $expire;
$this->cache = new \Memcache();
$this->cache->pconnect(CACHE_HOSTNAME, CACHE_PORT);
}
public function get($key) {
return $this->cache->get(CACHE_PREFIX . $key);
}
public function set($key,$value) {
return $this->cache->set(CACHE_PREFIX . $key, $value, MEMCACHE_COMPRESSED, $this->expire);
}
public function delete($key) {
$this->cache->delete(CACHE_PREFIX . $key);
}
}
每个缓存适配器都在“缓存”命名空间下定义,以避免冲突。
回想一下我们在上一节中讨论过的那些方法,它们实际上在这里结束了。 所以,当你调用get
方法中Cache
类,它实际上调用get
实际适配器定义的类,在我们的情况下,它的方法Mem
类。
操纵缓存条目的实际逻辑发生在适配器类方法中。 如您所见,在Mem
类的构造函数中,我们初始化了Memcache对象,并使用pconnect
方法建立了连接。 最后,我们使用Memcache对象的get,set和delete方法来操作缓存条目。
另一方面,如果您看一下文件高速缓存处理程序的实现,则需要花费一些精力来使用文件系统功能来存储和检索高速缓存条目。 除此之外,实现没有区别。
就OpenCart中的缓存适配器而言,仅此而已。 当然,如果需要,您可以继续制作自己的自定义缓存处理程序。 您只需要实现所需的方法就可以了。
今天就这样。 我希望您喜欢本教程,并鼓励您根据需要在自定义模块中使用缓存。
结论
今天,我们讨论了OpenCart中的缓存。 我们从缓存的基础知识入手,然后继续研究前端如何使用缓存。 最后,我们介绍了OpenCart中可用的不同缓存适配器。
随时使用下面的提要以查询和建议的形式表达您的想法。
翻译自: https://code.tutsplus.com/tutorials/understand-caching-in-opencart--cms-25685