在PHP中,readfile()
函数用于从服务器读取文件并输出到浏览器。如果你想要处理缓存问题,可以使用以下方法:
- 文件版本控制:为文件添加版本号,例如
style.css?v=1.0.1
。当文件内容发生变化时,更新版本号。这样,浏览器会识别到文件更改并重新请求新文件,而不是使用缓存的版本。
$filename = 'style.css'; $version = '1.0.1'; // 可以根据文件内容动态生成版本号 header('Content-type: text/css'); header('Cache-Control: no-cache, must-revalidate'); header('Pragma: no-cache'); header("Content-Disposition: attachment; filename=\"$filename?v=$version\""); readfile($filename);
- 使用HTTP缓存头:通过设置HTTP响应头来控制浏览器缓存。例如,你可以使用
Last-Modified
和ETag
头来指定文件的最后修改时间和唯一标识符。这样,浏览器会根据这些头来判断文件是否需要重新请求。
$filename = 'style.css'; // 获取文件信息 $fileinfo = pathinfo($filename); $mtime = filemtime($filename); $etag = md5_file($filename); // 设置HTTP响应头 header('Content-type: text/css'); header('Cache-Control: max-age=86400'); // 缓存时间为一天 header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $mtime) . ' GMT'); header('ETag: ' . $etag); header('Pragma: cache'); // 检查浏览器发送的If-Modified-Since和If-None-Match头 if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && isset($_SERVER['HTTP_IF_NONE_MATCH'])) { $browser_mtime = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']); $browser_etag = trim($_SERVER['HTTP_IF_NONE_MATCH']); if ($browser_mtime >= $mtime && $browser_etag == $etag) { // 文件未更改,返回304状态码 header('HTTP/1.1 304 Not Modified'); exit; } } // 文件已更改或浏览器未发送缓存头,输出文件内容 readfile($filename);
这两种方法可以结合使用,以确保文件在内容发生变化时能够及时更新,同时充分利用浏览器的缓存机制。