我在理解一个概念时遇到问题。假设您已登录并将一些商品添加到您的购物车,但没有签出您已注销。下次您登录时,您将找到包含您之前添加的物品的购物车。我想知道这个概念是如何工作的?经过一番研究,我知道它正在使用缓存文件。但是这个缓存文件是如何工作的?这个缓存文件与后端数据库有什么关系?
2 回答
OpenCart 使用customer
表中的字段将购物车项目存储为序列化的数据数组。该字段称为cart
。类似地,愿望清单使用相同的技术并在表中wishlist
再次称为 。customer
要实际加载缓存的内容,使用此代码在login()
方法 in中加载值/system/library/customer.php
if ($customer_query->row['cart'] && is_string($customer_query->row['cart'])) {
$cart = unserialize($customer_query->row['cart']);
foreach ($cart as $key => $value) {
if (!array_key_exists($key, $this->session->data['cart'])) {
$this->session->data['cart'][$key] = $value;
} else {
$this->session->data['cart'][$key] += $value;
}
}
}
此代码实际上将商品添加到当前购物车中,因此如果您的购物篮中已有商品,它会将它们合并
当您提出更多问题时 - 一个与购物车和物品存储相关,以及一两个与缓存相关的问题,正如Jay Gilford回答与购物车相关的部分一样,这里是缓存的答案:
Opencart 缓存您在每次页面加载时使用最多的数据:货币、语言、类别、产品、类别产品计数、重量等级、税收等级等。在模型中(现在让我们谈谈前端/目录)当获取data OpenCart 在查询数据库之前查找缓存的数据。如果发现缓存数据,它们将被提取和反序列化(它们使用 PHP 的函数存储在纯文本文件中serialize()
)并返回到控制器而不查询数据库 - 因此提取应该更快1。如果没有缓存数据,则查询数据库,然后将获取的数据库数据序列化(使用 PHP 的函数serilizae()
)并保存到相应的缓存文件中。
这是可能发生的一个小问题 - 在您直接在数据库中编辑数据之后(使用 phpMyAdmin,可能是因为这个原因),前端不存在更改。这是因为有缓存的旧数据在被要求时被提取。如果您必须进行此类编辑,请不要忘记手动删除相应的缓存文件。
这导致我们进入模型的管理(后端)部分 - 在数据成功存储到数据库后编辑或添加数据(类别、产品、货币、重量等级等)时,相应的缓存文件会立即删除,因此它可以在包含最新数据的前端重新创建。
缓存文件可以在/system/cache/
文件夹中找到。
编辑:缓存被实例化并在其中注册index.php
,然后在控制器和模型中都可以作为$this->cache
while 方法访问set()
,get()
并且delete()
是可调用的。缓存类本身可以在以下位置找到,system/library/cache.php
并且非常简单明了。
这样的答案是否足够?
1我看到一个服务器的 PHP-MySQL 通信速度非常快,而文件系统访问速度很慢......