由于MySQL查询,我的函数很慢 只要某些MySQL表保持不变,该函数将返回相同的结果 在PHP / MySQL中“记忆”这样一个函数的最简单方法是什么?
修改
我希望看到的是:
答案 0 :(得分:1)
为什么不缓存查询的结果并清除缓存,如果这些特定的表发生了变化?
答案 1 :(得分: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
享受并祝你好运!
答案 2 :(得分:1)
首先,您可以将结果存储在semlf制作的“缓存”中。同时第一次处理结果。然后,当再次触发相同的查询时,您只需从缓存中读取结果。但这只有在您知道表格中没有任何变化时才有效。你呢 ?
除此之外:mysql RDMBS非常擅长缓存。因此,通常第二次触发相同的查询将获得更快的回复。还不够吗?
答案 3 :(得分: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”,否则你将返回错误的数据。
答案 4 :(得分:0)
看看Cachalot。代码看起来像这样:
$cache = new \Cachalot\ApcCache();
$products = $cache->getCached([$productRepository, 'findByCategory'], ['cars']);
支持不同的后端:Apc,Xcache,Memcached,Redis,Couchbase。