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

Ozz*_*zzy 28 php mysql performance caching

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

什么是在PHP中缓存结果的最佳方法,所以我不必每次加载页面重新运行查询?

我的第一个想法是可能循环结果,将它们添加到数组中......序列化它们然后存储在文件中.现在因为创建缓存只发生一次,如果数组包含100万个结果,我可以负担序列化函数的开销.然而,加载缓存的文件然后在每个页面加载上反序列化数组可能会对性能产生影响.

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

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

Mar*_*ker 18

如果这是一个直接数组,那么你可以使用var_export()而不是serialize(用适当的""包装它并将其写入.php文件;然后在脚本中包含().如果你能写它就做得最好在htdocs树之外,并且只适用于内存缓存会认为过多的大量数据.


Dan*_*ugg 12

Memcached.

我总是尝试至少创建一次自己的解决方案,以便更好地掌握在大多数情况下发生的事情.当我创建自己的缓存解决方案时,我基本上就是你所说的.

// 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);
Run Code Online (Sandbox Code Playgroud)

在查询触发之前,它将在cache目录中搜索具有匹配查询哈希的文件.如果是,则进行测试timestamp + ttl <= current_time,如果为true,则返回未序列化的文件内容.否则,覆盖它.

  • 我昨天做了同样的事情,努力减少一些特定查询所带来的影响,但它实际上最终没有帮助那么多.我假设通过序列化,处理文件(无论是阅读,写入还是其他),反序列化等引入的开销最终变得足够慢,以至于它不值得做. (2认同)