phpEnv本身不提供静态资源缓存功能,其本质是在所启用的Apache或Nginx中配置HTTP缓存头:Apache需启用mod_expires与mod_headers并配置.htaccess;Nginx需在server或location块中设置expires和add_header;且必须确保静态文件由Web服务器直接响应,而非经PHP脚本中转。

phpEnv 本身不提供静态资源缓存功能,它只是一个 Windows 下的 PHP 集成环境(类似 XAMPP、WampServer),底层用的是 Apache 或 Nginx 作为 Web 服务器。所以「phpEnv 配置静态资源缓存」本质是:**在 phpEnv 所启用的 Web 服务器中配置 HTTP 缓存头或反向代理缓存**。直接改 phpEnv 的图形界面或 ini 文件无法生效。
Apache 模式下用 Expires 和 Header 控制缓存
phpEnv 默认多数版本使用 Apache。若你确认当前运行的是 Apache(查看系统托盘图标或 phpenv\apache\conf\httpd.conf),缓存需靠 mod_expires 和 mod_headers 实现。
- 确保这两模块已启用:检查
httpd.conf中这两行未被注释:LoadModule expires_module modules/mod_expires.so、LoadModule headers_module modules/mod_headers.so - 在站点根目录(如
phpenv\www\myapp)下新建或编辑.htaccess,加入以下内容:
<IfModule mod_expires.c> ExpiresActive On ExpiresByType text/css "access plus 1 year" ExpiresByType text/javascript "access plus 1 year" ExpiresByType application/javascript "access plus 1 year" ExpiresByType image/jpg "access plus 1 year" ExpiresByType image/jpeg "access plus 1 year" ExpiresByType image/png "access plus 1 year" ExpiresByType image/gif "access plus 1 year" ExpiresByType font/woff2 "access plus 1 year" </IfModule> <p><IfModule mod_headers.c> <FilesMatch ".(js|css|jpg|jpeg|png|gif|woff2)$"> Header set Cache-Control "public, max-age=31536000, immutable" </FilesMatch> </IfModule>
注意:ExpiresByType 设置的是 Expires 头,而 Header set Cache-Control 设置的是更现代的 Cache-Control;两者可共存,但浏览器优先认 Cache-Control。如果只启用了其中一个模块,另一段会静默失效。
Nginx 模式下必须用 add_header + expires
部分 phpEnv 版本支持切换为 Nginx 模式(通常在主界面有切换按钮)。此时所有 Apache 配置(包括 .htaccess)完全无效,必须修改 Nginx 配置文件:phpenv\nginx\conf\nginx.conf 或站点对应的 server 块。
立即学习“PHP免费学习笔记(深入)”;
- 在对应
location块中(例如匹配静态资源路径),添加:
location ~* \.(js|css|png|jpg|jpeg|gif|woff2|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, max-age=31536000, immutable";
}-
expires 1y会同时设置Expires和Cache-Control: max-age=...,但它无法添加public或immutable—— 所以必须补上add_header;否则 CDN 或中间代理可能不缓存 - 不要把
add_header放在server级别全局写,否则 HTML 响应也会被加上该头,导致页面无法及时更新 - 修改后必须重启 phpEnv 的 Nginx 服务(不是“重新加载”,是彻底 stop → start)才能生效
为什么改了没反应?常见失效原因
即使配置正确,也可能看不到 Cache-Control 或缓存行为,原因很具体:
- PHP 脚本主动输出了冲突头:比如你在
index.php里写了header('Cache-Control: no-cache');,它会覆盖 Nginx/Apache 设置的头 - phpEnv 启用了「X-Sendfile」或类似机制:某些旧版 phpEnv 在发送静态文件时走 PHP
readfile(),绕过了 Web 服务器的原生静态处理,此时缓存头根本不会发出去 - 浏览器 DevTools 的 Network 标签页没清缓存就刷新:按
Ctrl+Shift+R强制硬刷新,或禁用缓存(勾选 “Disable cache”)再测试 - 你访问的是
http://localhost:8080/xxx.php这类动态路径,而非直接请求/static/app.js—— 动态脚本返回的响应默认无缓存,得自己加头,且不推荐对 PHP 输出的 JS/CSS 做强缓存
真正起效的静态缓存,前提是资源由 Web 服务器(Apache/Nginx)**直接读取并响应**,而不是经由 PHP 解析中转。这是最容易被忽略的前提 —— 很多人在 phpEnv 里把 CSS 放进 public/ 目录,却仍用 index.php?file=style.css 的方式加载,那永远缓存不了。



















