我试图从数据库caching由PHP脚本生成的JSON内容。 但数据集非常稳定,只有很less的变化或增加。 含义数据可能会持续数周。 问题是它包含一个LOB列,只需要很长的时间来加载,比从文本文件中提供json的时间要长,这意味着git是实际的数据库调用,使得它慢。
我显示在分页(数据表jQuery插件)表中的数据和每个页面更改数据从数据库中再次获取,也返回到上一页时。
我试过以下内容:
"beforeSend": function (request) { request.setRequestHeader("cache-control", "max-age=86400"); },
不起作用。
我试过mod_expires:
ExpiresActive On ExpiresDefault "access plus 4 hours" ExpiresByType application/javascript "access plus 1 day" ExpiresByType application/json "access plus 1 day"
不起作用。
因此,我假设所有这些设置仅适用于文件系统上的真实文件,而不适用于dynamic生成的东西?
我更喜欢使用Apache / PHP的可configuration方法,因为我不能完全控制服务器。
首先编辑:
请注意,JSON包含多个logging,所以一个键/值存储将是一种很难avhieve。 关键将包含很多东西:查询/筛选expression式和请求页面的分页。
编辑2:
开发和生产。 是Windows …所以memcached是不是一个真正的select…
编辑3:
我试过kristovaher解决scheme,但不起作用。 高速caching标题是不是在响应所有的时间和一些plaing周围后,我相信我确定了这个问题:我需要使用NTLM身份validation,当做两个请求后不久,彼此工作正常,但是,如果你等一下,似乎用户被重新authentication,然后caching控制头被“丢失”。
缓存控制是一个响应头。 (编辑:它实际上也是一个请求头,感谢Gumbo指出它)。你需要在响应中添加这样的头文件(PHP发送的数据)。
<?php // How long my cache should last $cacheDuration=300; // in seconds // Client is told to cache these results for set duration header('Cache-Control: public,max-age='.$cacheDuration.',must-revalidate'); header('Expires: '.gmdate('D, d MYH:i:s',($_SERVER['REQUEST_TIME']+$cacheDuration)).' GMT'); header('Last-modified: '.gmdate('D, d MYH:i:s',$_SERVER['REQUEST_TIME']).' GMT'); // Pragma header removed should the server happen to set it automatically // Pragma headers can make browser misbehave and still ask data from server header_remove('Pragma'); ?>
但实际上你应该做得比这更好。 缓存控制头只告诉单个客户端如何维护这些数据,另一个用户可能仍然会让你的服务器重新做这件事情。 这就是智能缓存系统的样子:
但是在做这件事的时候,你需要注意很多事情,如果你的缓存包含了敏感信息,那么你必须确保这个缓存不会被转发给错误的客户端。
编辑:
现场示例在这里: http : //waher.net/cachetest.php (与上面显示的代码相同)。
该文件由浏览器从缓存中加载5分钟。 但请注意,如果刷新页面,则会忽略浏览器缓存,并向服务器发出请求。 如果您打开新的选项卡而不是刷新页面并输入URL,Firebug / Chrome开发工具将显示文件是从缓存中加载的,您可以尝试更好。
我玩了一下,得出结论,缓存与客户端和使用标题似乎不起作用在我的情况。 也许我做错了,也许这是我的应用程序的工作方式或Web服务器配置。
无论如何,我的解决方案是使用APC:
http://www.php.net/manual/en/book.apc.php
我正在使用Windows,适当的二进制文件可以在这里找到:
http://downloads.php.net/pierre/
哪一个取决于你的PHP版本以及它是如何被编译的(使用vc6或vc9)。 php_apc.dll将需要放在您的PHP扩展目录中,您将需要添加该行
extension=php_apc.dll
到php.ini
那么你bascially做:
if (apc_exists($key)){ return apc_fetch($key); } // get data from database because it was not in the cache //... //add data to cache apc_add($key, $result);
如果我的页面上的数据没有被缓存,大约需要1-2秒才能加载。 那不错,但感觉非常滞后。 如果数据在缓存中更像是20-30ms。 当然这个差异是非常明显的。