在PHP开发中,设置静态内容缓存时间是提升网站性能的重要手段,通过减少重复计算和数据库查询,可以显著加快页面加载速度并降低服务器负载,静态内容缓存主要针对不常变化的数据,如HTML页面、CSS、JavaScript文件、图片资源等,合理设置缓存时间能让浏览器或代理服务器直接返回缓存的副本,避免重复请求,以下是PHP中设置静态内容缓存时间的详细方法和实现步骤。

通过HTTP响应头设置缓存时间
PHP允许通过header()
函数直接发送HTTP响应头来控制缓存行为,常用的缓存控制头包括Cache-Control
、Expires
和Last-Modified
,这些头信息可以指导浏览器或CDN如何缓存内容。
-
使用Cache-Control头
Cache-Control
是最常用的缓存控制机制,可以通过指定max-age
值来设置缓存时间(单位为秒),设置缓存时间为1小时(3600秒):header('Cache-Control: max-age=3600, public');
public
:表示响应可以被任何缓存(如浏览器、CDN)存储。private
:表示响应只能被客户端浏览器缓存,不能被中间代理缓存。no-cache
:表示需要与服务器验证缓存是否有效。no-store
:禁止任何形式的缓存存储。
-
使用Expires头
Expires
头指定一个具体的过期时间(GMT格式),通常与Cache-Control
结合使用,设置缓存过期时间为当前时间后1小时:$expires = time() + 3600; header('Expires: ' . gmdate('D, d M Y H:i:s', $expires) . ' GMT');
-
结合Last-Modified头
通过Last-Modified
头可以告诉客户端资源的最后修改时间,客户端再次请求时会发送If-Modified-Since
头,服务器通过比较时间决定是否返回304状态码(未修改):(图片来源网络,侵删)$lastModified = filemtime(__FILE__); header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $lastModified) . ' GMT'); if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $lastModified) { header('HTTP/1.1 304 Not Modified'); exit; }
通过.htaccess设置缓存(Apache服务器)
如果使用Apache服务器,可以通过.htaccess
文件为特定文件类型设置缓存时间,无需修改PHP代码,为CSS、JS和图片文件设置30天缓存:
<FilesMatch "\.(css|js|jpg|jpeg|png|gif|ico)$"> Header set Cache-Control "max-age=2592000, public" </FilesMatch>
这种方法适合静态资源,但无法针对动态生成的PHP页面内容。
使用PHP文件缓存(File-based Caching)
对于动态生成的PHP页面内容,可以通过将输出保存到文件并设置文件缓存时间来实现,以下代码将页面内容缓存到cache/
目录,缓存时间为1小时:
$cacheFile = 'cache/page_' . md5($_SERVER['REQUEST_URI']) . '.html'; $cacheTime = 3600; // 1小时 if (file_exists($cacheFile) && (time() - filemtime($cacheFile)) < $cacheTime) { readfile($cacheFile); exit; } // 开启输出缓冲 ob_start(); // 动态生成页面内容(如数据库查询、HTML渲染等) echo '<html><body><h1>动态内容</h1></body></html>'; // 将输出写入缓存文件 file_put_contents($cacheFile, ob_get_contents()); ob_end_flush();
缓存文件清理:可以通过定时任务(如Cron)或设置缓存过期机制定期清理过期的缓存文件。

使用Memcached或Redis缓存
对于高并发场景,可以使用内存缓存系统(如Memcached或Redis)存储静态内容,并设置过期时间,以下为使用Memcached的示例:
$memcached = new Memcached(); $memcached->addServer('127.0.0.1', 11211); $cacheKey = 'page_content_' . md5($_SERVER['REQUEST_URI']); $cacheTime = 3600; // 1小时 $data = $memcached->get($cacheKey); if ($data === false) { // 缓存未命中,生成内容 $data = '<html><body><h1>动态内容</h1></body></html>'; $memcached->set($cacheKey, $data, $cacheTime); } echo $data;
内存缓存的优势是读写速度快,适合频繁访问的数据。
CDN缓存控制
如果使用CDN服务(如Cloudflare、阿里云CDN),可以通过CDN管理面板设置缓存规则,为特定URL路径设置缓存时间,或通过CDN提供的API动态修改缓存配置,CDN缓存通常结合Cache-Control
头工作,当CDN节点收到请求时,会根据缓存策略决定是否回源请求服务器。
缓存策略对比
缓存方式 | 适用场景 | 优点 | 缺点 |
---|---|---|---|
HTTP响应头 | 动态PHP页面、静态资源 | 实现简单,浏览器原生支持 | 依赖客户端缓存,无法强制清理 |
.htaccess | Apache服务器的静态资源 | 配置灵活,无需修改代码 | 仅限Apache,无法控制动态内容 |
文件缓存 | 中小型网站的动态页面 | 实现简单,无需额外服务 | 文件IO性能较低,需手动管理缓存 |
Memcached/Redis | 高并发、大型应用 | 读写速度快,支持分布式 | 需要额外部署服务,内存成本较高 |
CDN缓存 | 全球化访问、静态资源加速 | 减少服务器负载,提升访问速度 | 依赖CDN服务商,配置复杂 |
相关问答FAQs
Q1: 如何在PHP中为不同类型的资源设置不同的缓存时间?
A1: 可以通过header()
函数结合文件扩展名或URL路径判断,为不同资源设置不同的缓存头。
if (pathinfo($_SERVER['REQUEST_URI'], PATHINFO_EXTENSION) === 'css') { header('Cache-Control: max-age=604800, public'); // CSS缓存7天 } elseif (pathinfo($_SERVER['REQUEST_URI'], PATHINFO_EXTENSION) === 'jpg') { header('Cache-Control: max-age=2592000, public'); // 图片缓存30天 }
Q2: 如何确保缓存失效时及时更新内容?
A2: 可以通过以下方式实现缓存失效:
- 主动清理更新时,手动删除缓存文件或调用Memcached/Redis的删除方法。
- 版本控制:在资源URL后添加版本号(如
style.css?v=1.0
),当资源更新时修改版本号,强制客户端重新请求。 - 依赖数据库触发:通过数据库触发器或应用逻辑在数据变更时标记缓存为无效。