仅当与缓存版本不同时才下载页面

时间:2013-09-12 08:29:19

标签: php

我需要在PHP页面中包含一个HTML页面(由ASP.net生成)。

为此,我使用:

echo file_get_contents("http://example.com");

但是这样我的服务器每次打开页面都需要下载页面。

我想添加缓存系统,但每次 example.com 内容发生变化时我都需要刷新缓存。
什么是最好的方法(如果有的话)检测内容是否在每次整个页面没有下载的情况下被更改?

这里是远程页面的HTTP标头:

HTTP/1.1 200 OK => 
Cache-Control => no-cache
Pragma => no-cache
Content-Length => 63648
Content-Type => text/html; charset=utf-8
Expires => -1
Server => Microsoft-IIS/7.5
Set-Cookie => ASP.NET_SessionId=xxxxxxxxxxxxxxxx; path=/; HttpOnly
X-Powered-By => ASP.NET
X-AspNet-Version => 4.0.30319
X-UA-Compatible => chrome=1
X-CID => 2-18
Date => Thu, 12 Sep 2013 08:54:59 GMT
Connection => close

另一个网站给了我这些:

Server Response HTTP/1.1 200 OK
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 65367
Content-Type: text/html; charset=utf-8
Expires: -1
Server: Microsoft-IIS/7.5
Set-Cookie: ARRSID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;Path=/;Domain=.example.com
Set-Cookie: ASP.NET_SessionId=xxxxxxxxxxxxxxxxxxx; path=/; HttpOnly
X-Powered-By: UrlRewriter.NET 2.0.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
X-UA-Compatible: chrome=1
X-Powered-By: ARR/2.5
X-Powered-By: ASP.NET
X-CID: 1-18
Date: Thu, 12 Sep 2013 08:56:03 GMT

4 个答案:

答案 0 :(得分:3)

假设您的服务器支持它,最好的方法是使用所述页面的标题。

具体来说,只要您的网络服务器支持,就检查If-Modified-Since,它正是您所需要的。

此外,您可以检查ETags标头,该标头将提供内容的标识符。页面上的更改应更改标识符(通常使用的是页面生成的时间戳)。同样,这取决于服务器配置。

答案 1 :(得分:3)

您可以使用cURL检索标题,重新加载文件或根据

的值提供缓存版本
Last-Modified: Fri, 14 Sep 2012 21:51:00 GMT

答案 2 :(得分:1)

我已经使用了@Prasanth的解决方案,但这只是一个评论,我无法设置答案,所以我在这里写。
如果他想在这里写下答案,我会将其设置为解决方案。

  

有关您服务器上的缓存,请参阅此内容。知道什么时候来源   改变了,你必须找到一些与服务器有关的东西。喜欢   服务器是否有 content-length 标头?如果是这样,你就可以知道了   如果此值更改,则刷新页面。但如果网站不是   完全在你的控制之下,或者你无法确切知道何时   页面已更改,您需要刷新缓存在您的文件   服务器时不时,可能使用cron作业。编辑:还检查   如果服务器具有Last-Modified标头,如Ruben所说。

因此,检查content-length可以解决问题。

答案 3 :(得分:-4)

int filemtime ( string $filename )返回您的上次修改日期 - 如果它是您的缓存时间之后 - 您可以重新加载页面,如果没有从缓存中获取它。