3

由于 MySQL 查询,我有一个很慢的函数。
只要某些 MySQL 表保持不变,该函数就会返回相同的结果。
在 PHP/MySQL 中“记忆”这样一个函数的最简单方法是什么?

编辑:
我想看到的是:

  • 类似于来自 MqSQL 的表的表哈希/上次修改日期。
  • PHP 方面的一些东西足够聪明,可以找出函数可以访问哪些表,并在适当的情况下缓存/检索结果。
4

5 回答 5

1

在我这边,我使用我构建的自定义 MVC 框架,每次调用基于 SELECT 的函数时,如果我已经处理了该结果,我将在缓存中查找并简单地返回它:

public static function getProductsByCategory(Activis_Catalog_Models_Category $category, array $except = array(), $limitedToActivation = true){

    //If the cache contains the request, return it
    if(isset(self::$__resultCache['getProductsByCategory'][md5(serialize(func_get_args()))])){ return self::$__resultCache['getProductsByCategory'][md5(serialize(func_get_args()))]; }

     ...... PROCESS THE FUNCTION NORMALLY ....

    self::$__resultCache['getProductsByCategory'][md5(serialize(func_get_args()))] = $objects;
    return $objects;

这将是一个简单的缓存机制,允许您缓存数据(在本例中为对象)并在以后再次调用相同的函数时返回它们。

如果您的模型中有 UPDATE/DELETE/INSERT 功能,您应该记住清除“$cache”,否则您将返回已更改的不正确数据。

于 2012-07-13T15:36:19.440 回答
1

您很可能正在寻找数据的缓存方法。

以下是一些可能感兴趣的方法:

内存缓存/APC

如果您可以访问支持此功能的主机,那就去吧。这是当今存储和检索数据的单一、最快的方式。

参考http ://www.php.net/manual/en/book.memcached.php


文件缓存

您可以使用 PHP 中的文件库将数据保存到文件并在需要时检索它。这可能对 Javascript 数据有用,并且您可以按需动态加载 .js 文件。

参考http ://www.php.net/manual/en/ref.filesystem.php


SQL 缓存

您还可以将结果存储在单独的表中(假设您正在使用昂贵的复杂操作并且尚未将其从单个表中拉出)以便于读/写访问。

参考http ://www.php.net/manual/en/ref.pdo-mysql.php


cronjobs为了随着时间的推移删除缓存的数据(为了节省空间或更新缓存),您可能会感兴趣。

参考http ://en.wikipedia.org/wiki/Cron

享受和好运!

于 2012-07-13T15:33:04.520 回答
1

首先,您可以在第一次处理结果时简单地将结果存储在 semlf 制作的“缓存”中。然后,当再次触发相同的查询时,您只需从缓存中读取结果。但这只有在您知道表格中没有任何变化的情况下才有效。你 ?

除此之外:mysql RDMBS 非常擅长缓存自身。因此,通常第二次触发相同的查询会更快地得到回复。这还不够吗?

于 2012-07-13T15:33:10.067 回答
1

如果这些特定的表发生变化,为什么不缓存查询结果并清除缓存呢?

于 2012-07-13T15:31:03.233 回答
0

看看卡查洛特。代码将如下所示:

$cache = new \Cachalot\ApcCache();
$products = $cache->getCached([$productRepository, 'findByCategory'], ['cars']);

支持不同的后端:Apc、Xcache、Memcached、Redis、Couchbase。

于 2016-01-10T22:12:01.427 回答