我目前正在构建一个PHP框架(原创,我知道),并正在为它开发一些优化功能。我遇到的一个困境是缓存MySQL结果的最佳方法是什么?我知道有些人会说,首先要优化你的MySQL等,但是为了论证,我的查询需要1分钟才能运行并尽可能优化。
在PHP中缓存结果的最佳方法是什么,所以我不必在每次加载页面时重新运行查询?
我的第一个想法是循环结果,将它们添加到数组中......序列化它们然后存储在文件中。现在因为创建缓存只发生一次,如果数组包含100万个结果,我可以负担序列化函数的开销。然而,加载缓存文件然后在每个页面加载上反序列化数组可能会对性能产生影响。
然后,当缓存而不是序列化结果和写入文件时,以一种在PHP可读数组中显示结果的方式写入文件会更好。因此,当它加载时,没有反序列化的开销。
是否还有其他(读取:更快)方法来缓存频繁使用的慢查询?
答案 0 :(得分:18)
如果这是一个直的数组,那么您可以使用var_export()而不是序列化(用适当的“”包装它并将其写入.php文件;然后在脚本中使用include()。如果您可以在htdocs树之外编写它,并且只适用于内存缓存会认为过多的大量数据,那么最好。
答案 1 :(得分:12)
我总是尝试至少创建一次自己的解决方案,以便更好地掌握在大多数情况下发生的事情。当我创建自己的缓存解决方案时,我基本上就是在做你正在谈论的内容。
// serialize an array of all results
$serialzedData = serialize($resultData);
// set TTL (60 seconds) and create cache filename with timestamp
$ttl = 60;
$cacheFilename = $ttl . '_' . time() . '_' . md5($sqlQuery)
// dump
file_put_contents($cacheFilename, $serializedData);
在查询触发之前,它会在cache
目录中搜索具有匹配查询哈希的文件。如果是,则测试timestamp + ttl <= current_time
,如果为true,则返回未序列化的文件内容。否则,覆盖它。
答案 2 :(得分:4)
答案 3 :(得分:3)
Google for Memcache,这应该会让你朝着正确的方向前进。