cachingJSON:Apache,PHP,jQuery

我试图从数据库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'); ?> 

但实际上你应该做得比这更好。 缓存控制头只告诉单个客户端如何维护这些数据,另一个用户可能仍然会让你的服务器重新做这件事情。 这就是智能缓存系统的样子:

  • 你生成你的JSON,不管它是什么。
  • 您将该JSON作为临时文件存储在您的文件系统中。
  • 您使用Cache-control标头将内容发送到客户端,使得浏览器不再向服务器请求数据,而是使用缓存。
  • 如果另一个用户访问该站点并且他们的浏览器没有该缓存,那么脚本应该检查缓存文件(在第2点中创建的缓存文件是否存在),如果存在,则从该文件读取客户端的数据,而不是生成它再次。
  • 您还应该检查缓存文件的年龄,可能每隔几天再次生成一次。

但是在做这件事的时候,你需要注意很多事情,如果你的缓存包含了敏感信息,那么你必须确保这个缓存不会被转发给错误的客户端。

编辑:

现场示例在这里: 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。 当然这个差异是非常明显的。