我有一个 PHP 网站,其中包含许多动态生成的页面。我尝试使用 mod_cache 来帮助提高性能,因为在大多数情况下,内容在一天内不会发生变化。
我已经尽可能地配置了 mod_cache,遵循了网上的示例,包括apache.org 上的 mod_cache 页面。当我设置时LogLevel debug
,我会看到一些有关缓存的信息,缓存并未发生。有很多这样的行对:
[Fri Jun 01 17:28:18 2012] [debug] mod_cache.c(141): Adding CACHE_SAVE filter for /foo/bar
[Fri Jun 01 17:28:18 2012] [debug] mod_cache.c(148): Adding CACHE_REMOVE_URL filter for /foo/bar
这很好,因为我已设置CacheEnable disk /foo
,以表明我希望缓存 /foo 下的所有内容。我是 mod_cache 的新手,但我对这些行的理解是,它只是意味着 mod_cache 已确认 URL 应该被缓存,但应该有更多行表明它正在将数据保存到缓存中,然后在后续访问同一 URL 时检索它们。
我可以一直点击同一个 URL,直到脸色发青,无论是否使用 F5 刷新,无论使用什么浏览器,无论使用什么计算机。日志中总是显示那两行,没有其他内容。
当我设置时CacheEnable disk /
,我会看到更多活动。但我不想缓存整个网站,而且该网站有许多不同的子路径,所以我不想修改代码以no-cache
在所有必要的位置设置标头。
我会提到这里使用了 mod_rewrite,将 /foo/bar 重写为类似的内容index.php?baz=/foo/bar
,但我的理解是 mod_cache 使用的是重写前的 URL,而不是重写后的 URL。
据我所知,我的响应标头不会妨碍缓存。以下是一次命中的示例:
Cache-Control:must-revalidate, max-age=3600
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:16790
Content-Type:text/html
Date:Fri, 01 Jun 2012 21:43:09 GMT
Expires:Fri, 1 Jun 2012 18:43:09 -0400
Keep-Alive:timeout=15, max=100
Pragma:
Server:Apache
Vary:Accept-Encoding
mod_cache配置如下:
CacheRoot /var/cache/apache2/
CacheDirLevels 3
CacheDirLength 2
CacheEnable disk /foo
什么阻碍了 mod_cache 完成其缓存工作?
答案1
这是我的配置并且运行良好:
<IfModule mod_disk_cache.c>
CacheEnable disk /
CacheRoot /var/cache/apache2/mod_disk_cache
CacheIgnoreCacheControl On
CacheMaxFileSize 2500000
CacheIgnoreURLSessionIdentifiers jsessionid
CacheIgnoreHeaders Set-Cookie
</IfModule>
您需要有适合您需求的 CacheIgnoreURLSessionIdentifiers,因此在 PHP 上您可能需要
CacheIgnoreURLSessionIdentifiers PHPSESSID
问候 Janning
答案2
我在尝试映射时遇到了同样的问题
CacheEnable Disk /api
唯一有效的映射是
CacheEnable Disk /
它缓存了所有内容。
尽管文档说 mod_cache 在 url-rewrite 之后运行,但实际上并没有。为了让它正常工作,我将其更改为
CacheEnable Disk /index.php/api