使用 PHP 提供巨大或许多辅助文件并不完全是它的用途。
相反,看看X-accel对于 Nginx,X-发送文件对于 Lighttpd 或mod_x发送文件对于阿帕奇。
初始请求由 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>
The ETag
主要用于减少网络流量,因为在某些情况下,要了解内容哈希,您首先必须计算它。
The 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
判断内容是否同时发生变化。