Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是一个PHP专用的“;“缓存引擎”;值得吗?_Php_Caching - Fatal编程技术网

是一个PHP专用的“;“缓存引擎”;值得吗?

是一个PHP专用的“;“缓存引擎”;值得吗?,php,caching,Php,Caching,我为我的web应用程序编写了一个相当小的框架,并认为我还应该为它添加一个小缓存 这相当简单: 如果当前页面作为文件存在于缓存中,并且文件不太旧,请将其读取并退出,而不是重新生成页面 如果当前页面未被缓存/过期,请重新缓存该页面并保存它 然而,它的坏处在于: 我对一个通过MySQL查询接收40篇相对较长帖子的页面进行了性能测试,结果表明使用缓存后,处理单个请求所需的时间甚至更长(每个测试1000次) 怎么会这样 执行MySQL查询,第一次循环查询结果,将结果传递给模板,然后第二次循环查询结果

我为我的web应用程序编写了一个相当小的框架,并认为我还应该为它添加一个小缓存

这相当简单:

  • 如果当前页面作为文件存在于缓存中,并且文件不太旧,请将其读取并退出,而不是重新生成页面

  • 如果当前页面未被缓存/过期,请重新缓存该页面并保存它

然而,它的坏处在于:

  • 我对一个通过MySQL查询接收40篇相对较长帖子的页面进行了性能测试,结果表明使用缓存后,处理单个请求所需的时间甚至更长(每个测试1000次)

  • 怎么会这样

  • 执行MySQL查询,第一次循环查询结果,将结果传递给模板,然后第二次循环查询结果,如何比执行
    filemtime()
    检查和读取更快

  • 我是否应该删除完整的原始PHP缓存并释放一些PHP缓存(如memcached)的可用性

    • 我想不是

      应用程序最慢的部分可能是数据库通信量


      如果您包含一个HTML/PHP缓存文件,它应该会更快。

      我不这么认为,根据您的实现,似乎还有一些其他问题。以下是关于它的两个重要资源:


      过早优化是万恶之源。如果不需要缓存,请不要使用缓存

      也就是说,如果您满足于不为每个请求提供动态内容,那么您可能需要考虑使用varnish之类的缓存代理,并完全删除PHP和Web服务器。即使是第一行PHP也有相当大的开销,通过PHP提供静态文件有点脏

      如果您只想缓存元素,可以使用memcached或APC的缓存。APC的优点是更容易获得(如果您关心性能,您应该在服务器上安装APC用于操作码缓存),memcached可以让您拥有一个可由多个Web服务器(和/或多个缓存)访问的缓存

      如果您使用的是apc和mysql查询缓存(默认为开),那么您的php代码已经被执行并作为操作码存储在apc中,如果您反复点击同一查询,那么mysql查询缓存也将缓存数据库结果。在这种情况下,大部分数据来自内存,因此文件读取速度可能会较慢。这种方法的真正好处是可以节省mysql连接的数量,但可能不会影响性能


      在您的情况下,使用像squid这样的缓存代理应该是理想的解决方案,这样页面就可以直接从缓存提供服务,直到过期。针对上述情况的另一个优化是将mysql输出缓存在memcache中,这比命中mysql要好,并且查询缓存的大小很小。最后,如果确实要缓存生成的标记,可以使用输出缓冲(ob_start)并将输出直接存储在memcache中

      你认为不是吗?我对它进行了测试,在这种情况下,mysql查询实际上更快——这就是问题所在。我甚至通过向数据库添加200多个条目来测试它,每个条目包含分布在varchar和文本字段上的大约100个字符。如果DB请求没有从缓存中读取所需的时间长,那么从缓存中构建不会更快。不管怎样,代码点火器的缓存或多或少就是这样工作的。在我使用它的短暂经验中,CI基于文件的缓存系统能够在大约50毫秒内从缓存中呈现页面,这非常好。如果您的页面呈现时间已经低于100毫秒,那么使用纯PHP缓存系统可能很难打败它。