我为PHP开发build立了一个小型的LAMP虚拟机。
它工作正常,除了当已经被服务的图像被修改在磁盘上,然后再次请求,“旧”的图像仍然在服务(我得到一个304从未修改答案从Apache2)。 这种caching行为在服务器上是可取的,但是在频繁编辑文件的开发环境中是一种痛苦。
唯一(不方便)的方式,我发现访问新的文件内容是:
sync; echo 3 > /proc/sys/vm/drop_caches sync; echo 3 > /proc/sys/vm/drop_caches 是否有一个Apache指令,我可以用它来确保apache将检查每次请求时磁盘上的文件是否已经更改?
更新 :加载的Apache模块:
#apache2ctl -t -D DUMP_MODULES 加载模块: core_module(静态) log_config_module(静态) logio_module(静态) mpm_prefork_module(静态) http_module(静态) so_module(静态) alias_module(共享) auth_basic_module(共享) authn_file_module(共享) authz_default_module(共享) authz_groupfile_module(共享) authz_host_module(共享) authz_user_module(共享) autoindex_module(共享) cgi_module(共享) deflate_module(共享) dir_module(共享) env_module(共享) mime_module(共享) negotiation_module(共享) php5_module(共享) setenvif_module(共享) status_module(共享) 语法OK
编辑 :其实,我的DocumentRoot存储在一个共享的VirtualBox文件夹。 这似乎是当一个文件被覆盖,virtualbox模块不会通知Linux使其caching失效。 因此,违反直觉的行为。 当我对“常规”linux目录执行相同的覆盖操作时,不会发生这种情况。
好的,我find了有关VirtualBox票证的解释:“sendfile”优化看起来不是由vboxsf模块实现的。
在解决此问题之前,解决方法是使用此Apache指令:
EnableSendfile Off
使用这个,服务器端的图像更改立即考虑在内。
由于这只是一个开发服务器,文件经常变化,最简单的解决scheme是完全禁用服务器的caching(或至less负责修改网站的VirtualHost)。 您可以使用CacheDisable指令来指示Apache中的mod_cache来处理这个问题。
CacheDisable指令指示mod_cache不会在url-string或以下cachingurl。
CacheDisable /local_files
其他选项包括查看mod_disk_cache和mod_mem_cache的可用指令,并使用它们来控制服务器上的caching。 您也可以将htcacheclean作为守护程序运行,以控制/限制mod_disk_cache使用的磁盘caching。
更新:如果mod_cache没有启用,那么上面的指令将不起作用。 这也意味着任何caching都是在操作系统级而不是Apache–据我所知,只有mod_cache(使用mod_mem_cache / mod_disk_cache)或者mod_file_cache是在Apache中完成caching的唯一方法。 您可以通过阅读Apache“caching指南”中的“操作系统caching”部分来了解更多关于此的信息。
你也可以在ServerFault 上看到这个问题的答案( 在Linux上禁用apache2的所有磁盘caching )。 它没有提供在Linux级别禁用caching的方法,但它确实表明您可以持续运行以下内容:
watch -n 1 `sync; echo 3 > /proc/sys/vm/drop_caches`
这可以用来刷新caching在内存中的所有内容。
Apache检查 – 听起来像时间戳没有被设置为文件部署的当前时间。
在这里看到我的答案。 基本上,有条件的要求是一个PITA和通常恶化的performance,而不是改善它们。 虽然这个答案与caching性能有关,但它也能解决你的问题。
C。