无论您使用的是哪种Web框架,缓存都是一种重要的工具,可以提高网站的整体性能。 您可以选择不同的缓存机制,例如文件,APC,Memcached等。 您可以根据自己的要求进行决定,有时需要多个适配器的组合来证明所需的结果是合理的。
OpenCart的核心中已经包含了两个缓存适配器,这就是您要创建自定义模板时可以遵循的模板。 要实现自定义适配器,您只需要按照约定创建方法并将逻辑包含在每个方法中,就可以了! 作为OpenCart缓存机制的一部分,它将被自动提取。
对于每个缓存适配器,它只是存储和检索更改的数据的基础机制。 我们的自定义数据库缓存适配器也是如此,这就是为什么我们需要创建一个保存缓存数据的自定义架构的原因。
在继续进行并开始创建自定义适配器之前,请确保您已安装了最新版本的OpenCart。
创建适配器架构
这是一个dbcache
MySQL表,它将保存我们的缓存数据。 因此,让我们创建它!
CREATE TABLE IF NOT EXISTS `{DB_PREFIX}dbcache` (
`key` varchar(255) NOT NULL,
`value` longblob NOT NULL,
`expire` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
这里要注意的重要一点是数据库前缀。 如果使用它,请确保相应地命名表。 例如,对于数据库前缀oc_
,您应该创建一个名为oc_dbcache
的表。
除此之外,表的结构非常简单,并且仅包含三列-键,值和到期。 key列保存缓存密钥,value列保存关联的值,expire列保存UNIX时间戳。
创建一个适配器文件
您可以在system\library\cache
目录下找到OpenCart提供的所有缓存适配器。 我们的自定义适配器也必须到那里,所以让我们创建一个文件system\library\cache\database.php
其中包含以下内容。
<?php
namespace Cache;
class Database {
private static $_db;
private $expire;
/**
* Constructor
*
* @param timestamp $expire Caching time in seconds
*/
public function __construct($expire) {
$this->expire = $expire;
$this->initDbInstance();
}
/**
* Helper method to create DB instance
*/
private function initDbInstance() {
if (is_null(static::$_db)) {
static::$_db = new \DB(DB_DRIVER, DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE, DB_PORT);
}
}
/**
* Fetch the value stored in cache by key
*
* @param string $key Cache Key
*
* @return mixed Value of cache key if found, boolean false otherwise
*/
public function get($key) {
$query = static::$_db->query("SELECT * FROM `" . DB_PREFIX . "dbcache` WHERE `key` = '" . $key . "' AND `expire` >= '" . time() ."'");
if ($query->num_rows) {
return unserialize($query->row['value']);
}
return false;
}
/**
* Set the cache value by key
*
* @param string $key Cache Key
* @param mixed $value Cache value
*/
public function set($key, $value) {
$this->delete($key);
static::$_db->query("INSERT INTO " . DB_PREFIX . "dbcache SET `key` = '" . $key . "', `value` = '" . mysql_escape_string(serialize($value)) . "', `expire` = '" . (time() + $this->expire) . "'");
}
/**
* Delete the value stored in cache by key
*
* @param string $key Cache Key
*/
public function delete($key) {
static::$_db->query("DELETE FROM " . DB_PREFIX . "dbcache WHERE `key` = '".$key."'");
}
}
按照约定, Database
类在Cache
命名空间下定义。 有两个属性, $_db
和$expire
。 $_db
保存数据库实例,并且$expire
设置为在实例化该类时缓存生存期。 将$_db
属性声明为静态的原因是它持有的单例对象。
在类的构造函数中,我们将从OpenCart框架传递的缓存时间分配给$expire
属性,并调用在同一类中定义的initDbInstance
方法,该方法创建并分配数据库实例给$_db
如果尚不存在) 。
接下来, get
方法用于按键和到期时间获取缓存条目,而set
方法用于在数据库中插入新的缓存条目。 另外,我们正在序列化set
方法中的缓存数据,以确保其存储正确。 当然,我们需要在实际返回它之前在get
方法中对它进行反序列化!
最后,有一个delete
方法可以从数据库中删除一个条目。 这里有趣的是,set方法每次都会调用delete方法,以确保我们最终不会创建重复的缓存项!
因此,就我们的自定义缓存适配器文件设置而言就是这样。 在下一节中,我们将看到如何将其插入OpenCart核心框架。
插入我们的自定义缓存适配器
不幸的是,没有允许您插入自定义缓存适配器的后端配置。 因此,就本教程而言,我们将继续并直接影响其在核心中的处理方式。
继续并在您站点的文档根目录下打开index.php
。
查找以下代码段。
$cache = new Cache('file');
替换为:
$cache = new Cache(database');
因此,正如您所看到的,我们只是更改了在创建新的$cache
对象时传递的参数或适配器名称。
以相同的方式,对位于admin
目录下的index.php
文件执行此操作。 确保前端和后端都使用我们的自定义缓存适配器。
你几乎完成! 继续并访问前端和后端的几页,您应该看到dbcache
MySQL表中充满了新记录!
这样,您就可以继续为其他存储引擎创建一个缓存适配器。 尽管我们已经以简单的方式演示了它,但我认为对于您的下一个定制适配器而言,最重要的是概念!
结论
与往常一样,如果您正在寻找其他OpenCart工具,实用程序,扩展等,以便可以在自己的项目中使用或用于自己的教育,请不要忘记查看我们在市场上提供的产品 。
今天,我们讨论了如何在OpenCart中创建自定义缓存适配器。 数据库缓存适配器是在演示过程中创建的。 随时使用以下供稿发布您的查询!
翻译自: https://code.tutsplus.com/tutorials/create-a-custom-caching-adapter-in-opencart--cms-26211