由于 MySQL 查询,我有一个很慢的函数。
只要某些 MySQL 表保持不变,该函数就会返回相同的结果。
在 PHP/MySQL 中“记忆”这样一个函数的最简单方法是什么?
编辑:
我想看到的是:
- 类似于来自 MqSQL 的表的表哈希/上次修改日期。
- PHP 方面的一些东西足够聪明,可以找出函数可以访问哪些表,并在适当的情况下缓存/检索结果。
在我这边,我使用我构建的自定义 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”,否则您将返回已更改的不正确数据。
您很可能正在寻找数据的缓存方法。
以下是一些可能感兴趣的方法:
内存缓存/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
享受和好运!
首先,您可以在第一次处理结果时简单地将结果存储在 semlf 制作的“缓存”中。然后,当再次触发相同的查询时,您只需从缓存中读取结果。但这只有在您知道表格中没有任何变化的情况下才有效。你 ?
除此之外:mysql RDMBS 非常擅长缓存自身。因此,通常第二次触发相同的查询会更快地得到回复。这还不够吗?
如果这些特定的表发生变化,为什么不缓存查询结果并清除缓存呢?
看看卡查洛特。代码将如下所示:
$cache = new \Cachalot\ApcCache();
$products = $cache->getCached([$productRepository, 'findByCategory'], ['cars']);
支持不同的后端:Apc、Xcache、Memcached、Redis、Couchbase。