gpt4 book ai didi

php - 在 PHP 动态创建时缓存 HTTP 响应

转载 作者:IT王子 更新时间:2023-10-29 00:03:19 27 4
gpt4 key购买 nike

我认为我的问题看起来很随意,但请耐心等待它变得有趣(至少对我而言 :))。

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

理想的策略是使用“If-None-Match”请求 header 和“ETag”响应 header 来实现反向代理缓存系统。尽管我知道到这里为止,但我不确定这是否可行,或者我应该返回什么作为响应以实现此技术!

最佳答案

用 PHP 提供大量或许多辅助文件并不是它的目的。

相反,请查看 X-accel对于 nginx,X-Sendfile对于 Lighttpd 或 mod_xsendfile用于 Apache。

初始请求由 PHP 处理,但一旦确定了下载文件,它就会设置一些 header 以指示服务器应处理文件发送,之后 PHP 进程将被释放以提供其他服务。

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

静态生成的内容

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

如果您不能或不想写入本地文件,您可以使用 HTTP 响应 header 来控制缓存:

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

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

动态生成的内容

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

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来判断内容是否同时发生了变化。

关于php - 在 PHP 动态创建时缓存 HTTP 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10596116/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com