PHP缓存MySQL结果的最佳方法?

PHP缓存MySQL结果的最佳方法?,php,mysql,performance,caching,Php,Mysql,Performance,Caching,我目前正在构建一个PHP框架(我知道是原创的),我正在为它开发一些优化功能。我遇到的一个难题是,缓存MySQL结果的最佳方法是什么?我知道有些人会说,首先优化你的MySQL等等,但是为了论证起见,我的查询需要1分钟运行,并且尽可能优化 用PHP缓存结果的最佳方法是什么,这样我就不必在每次加载页面时都重新运行查询了 我的第一个想法是循环搜索结果,将它们添加到数组中。。。将它们序列化,然后存储在文件中。现在,由于创建缓存只发生一次,如果数组包含100万个结果,我可以承担序列化函数的开销。然而,加载缓

我目前正在构建一个PHP框架(我知道是原创的),我正在为它开发一些优化功能。我遇到的一个难题是,缓存MySQL结果的最佳方法是什么?我知道有些人会说,首先优化你的MySQL等等,但是为了论证起见,我的查询需要1分钟运行,并且尽可能优化

用PHP缓存结果的最佳方法是什么,这样我就不必在每次加载页面时都重新运行查询了

我的第一个想法是循环搜索结果,将它们添加到数组中。。。将它们序列化,然后存储在文件中。现在,由于创建缓存只发生一次,如果数组包含100万个结果,我可以承担序列化函数的开销。然而,加载缓存文件,然后在每次页面加载时取消阵列序列化,可能会影响性能

那么,在缓存时,不是序列化结果和写入文件,而是以一种在PHP可读数组中显示结果的方式写入文件,这会是一个更好的主意吗。因此,当它加载时,没有非序列化开销


是否有其他(读取:更快)的方法缓存慢速查询以供频繁使用?

Google for Memcache,这将使您找到正确的方向。

如果这是一个直数组,那么您可以使用而不是序列化(用适当的然后将它写到.php文件中,然后在脚本中完成。如果你能在HTDOCs树之外写它,最好只做它,只适用于内存缓存会考虑过多的大量数据。

我总是尝试创建自己的解决方案至少一次,以便更好地掌握大多数情况下的情况。当我创建自己的缓存解决方案时,我基本上做到了您所说的

// 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);

在触发查询之前,它将在
缓存
目录中搜索具有匹配查询哈希的文件。如果这样做,它将测试
时间戳+ttlMysql缓存查询结果,可能是您应该增加Mysql查询缓存大小?或者在独立表中缓存大查询的结果?

我理解memcache是compi的正确吗需要事先在服务器上安装的led库?如果是这样,我不能期望每个使用该框架的人都安装它:/APC可能更容易使用,因为它是一个不需要外部应用程序的PHP模块。虽然我确信性能没有那么好。或者redis,但人们不太可能访问它到redis而不是到memcache或APC@adam-peck APC通常比memcache快,因为它不需要从外部发出请求服务器,因此没有网络最新版本McCache和APC是不可比的。它们实现了两个不同的目标。这是一个好主意,相比之下,我的想法就相形见绌了。我想我会在现有的自制解决方案中实现类似的功能。如果你想避免序列化,这可能是在框架内实现它的最佳方法。尽管我怀疑是否会有序列化的开销很大。序列化将显著减少缓存文件的大小。我昨天做了几乎相同的事情,试图减少一些特定查询的影响,但实际上没有起到多大的作用。我假设序列化、处理文件所带来的开销(无论是阅读、写作还是其他),未序列化等。最终速度太慢,不值得这么做。在表更新/插入频繁的情况下,上述解决方案可能不起作用。在需要实时数据甚至超过60秒的实时/关键应用程序中,这是不够的,而且会有更改,返回的旧数据会比更新的数据多。您可以使用MySQL UDF并在insert/update/delete触发器上调用php脚本以使缓存文件无效。这样,您将确保没有旧的缓存文件驻留在您的目录中,并且您可能不需要使用60秒的时间。UDF和触发器可以是一种方法…绝对@SURFER-TM,这个简单的示例只是帮助您掌握缓存工作流程。今天,我将h结合了临时备忘录(如适用)和Redis,用于更长的TTL备份存储。请尝试使用MySQL UDF和触发器。您肯定会喜欢它。。。