当前位置: 首页 > 面试题库 >

由PHP动态创建HTTP响应时缓存它们

堵才哲
2023-03-14
问题内容

我认为我的问题似乎很随意,但请耐心等待,因为它变得很有趣(至少对我来说:)。

考虑一个PHP页面,其目的是从文件系统读取请求的文件并将其作为响应回显。现在的问题是如何为该页面启用缓存?需要指出的是,文件可能非常庞大,启用缓存是为了避免客户端一次又一次下载相同的内容。

理想的策略是使用“ If-None-Match”请求标头和“
ETag”响应标头,以实现反向代理缓存系统。即使我已经知道了这一点,但我不确定这是否可行,或者我应该返回什么作为实施此技术的响应!


问题答案:

用PHP服务大量或许多辅助文件并不完全是它的目的。

取而代之的是,将Nginx用作X-accel,将Lighttpd
用作X-Sendfile或将Apache
用作mod_xsendfile。

最初的请求由PHP处理,但是一旦确定了下载文件,它将设置一些标头以指示服务器应处理文件发送,此后,PHP进程将释放以处理其他内容。

然后,您可以使用Web服务器为您配置缓存。

静态生成的内容

如果您的内容是从PHP生成的,并且创建起来特别昂贵,则可以将输出写入本地文件,然后再次应用上述方法

如果您无法写入本地文件或不想写入本地文件,则可以使用HTTP响应标头来控制缓存:

Expires: <absolute date in the future>
Cache-Control: public, max-age=<relative time in seconds since request>

这将导致客户端缓存页面内容,直到它过期或当用户强制重新加载页面时(例如,按F5键)。

动态生成的内容

对于动态内容,您希望浏览器每次都能ping通您,但仅在有新内容时才发送页面内容。您可以通过设置其他一些响应头来完成此操作:

ETag: <hash of the contents>
Last-Modified: <absolute date of last contents change>

当浏览器再次ping您的脚本时,它们将分别添加以下请求标头:

If-None-Match: <hash of the contents that you sent last time>
If-Modified-Since: <absolute date of last contents change>

ETag主要用于降低网络流量在某些情况下,知道的内容哈希,你首先要计算它。

Last-Modified如果您具有本地文件缓存(文件具有修改日期),则最容易应用。一个简单的条件使其起作用:

if (!file_exists('cache.txt') || 
    filemtime('cache.txt') > strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
    // update cache file and send back contents as usual (+ cache headers)
} else {
    header('HTTP/1.0 304 Not modified');
}

如果您不能进行文件缓存,则仍然可以使用它ETag来确定内容是否已更改。



 类似资料:
  • 问题内容: 我想确保浏览器永远不会缓存服务器的响应,这样即使发出两个相同的请求(相隔一纳秒),也始终会与服务器联系。这是实现此目标的正确方法: 谢谢唐 问题答案: 不,那不是正确的方法。这是正确的方法: 您可能会看到其他人在建议其他条目/属性,但是当至少提及上述内容时,它们是完全不相关的。 更改后,请不要忘记在测试之前清除浏览器缓存。 也可以看看: 网站站长缓存教程

  • 问题内容: 我使用一些GeoIP服务在页面上放置国家/地区标记,具体取决于国家/地区IP。我需要为网站上的所有页面缓存JSON响应。 将此代码放入: 是否可以将其缓存?-似乎不起作用。 或者使用HTML5 localStorage可能更好,但是我不确定该怎么做。 我也尝试了JSONCache插件,但是对我来说不起作用。 问题答案: 您可以这样使用localStorage: 演示 因此,在您的特定情

  • 我希望能够创建一个自定义的AngularJS服务,当其数据对象为空时发出HTTP“GET”请求,并在成功时填充数据对象。 下一次调用此服务时,我希望绕过再次发出HTTP请求的开销,而是返回缓存的数据对象。 这可能吗?

  • 我正在寻找一种解决方案,在空手道中动态断言一个json响应,并为每个测试用例不同地维护数据。以下是回应示例: 我想断言id,名称,描述和对象数组,其值根据不同的id的变化。我知道模式方法,但我需要断言具体的价值。我还尝试了匹配功能,为每个测试用例保留json文件,但在不同的测试环境中很难维护。有人能帮我最好的方法来断言,以及如何维护测试数据。

  • 为了获得更好的UX,移动应用程序将数据存储在客户端(设备上),以便在加载应用程序时提供即时信息,而不必等待来自互联网的数据,甚至在设备脱机时也可以提供数据。当然,以后会尽可能地更新/提取数据。 我正在构建一个应用程序(在flutter中),它是一个类似应用程序的社交网络/信息提要:有用户、配置文件、提要、帖子等。当用户打开应用程序时,我想显示上次应用程序运行时可用的数据。 我的问题是什么是实现缓存

  • 问题内容: 我希望能够创建一个自定义AngularJS服务,该服务在其数据对象为空时发出HTTP“获取”请求,并在成功时填充该数据对象。 下次调用此服务时,我想绕过再次发出HTTP请求的开销,而是返回缓存的数据对象。 这可能吗? 问题答案: Angular的$ http 内置了一个缓存。根据文档: cache – {boolean | Object} – 用$ cacheFactory创建的布尔值