4

我需要在 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

4 回答 4

3

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

具体来说,If-Modified-Since如果您的网络服务器支持它,它会完全满足您的需求。

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

于 2013-09-12T08:35:51.373 回答
3

您可以使用 cURL 来检索标头并重新加载文件或提供缓存版本,具体取决于

Last-Modified: Fri, 14 Sep 2012 21:51:00 GMT

标题

于 2013-09-12T08:35:51.820 回答
1

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

有关在您的服务器上进行缓存,请参阅此内容。要知道源何时更改,您必须找到有关服务器的独特之处。像服务器有content-length标题吗?如果是这样,您可以知道如果此值更改,则页面已刷新。但是,如果该站点并非完全在您的控制范围内,或者您无法确切知道页面何时更改,则您可能希望不时刷新缓存在服务器上的文件,可能使用 cron 作业。编辑:还检查服务器是否具有鲁本所说的 Last-Modified 标头。

所以检查content-length就行了。

于 2013-09-17T08:37:33.943 回答
-4

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

于 2013-09-12T08:34:26.927 回答