Adobe ColdFusion(和 Railo)将 CFML 模板编译为 JVM 字节码,如果配置为这样做,则将编译的类作为 .class 文件写入磁盘。模板缓存是一种机制:如果目标类已经加载,不要费心查看磁盘上的(源)文件是否需要重新编译——相信内存中的内容。
最近对 ACF 和 Railo 的增强允许您指定(源)文件可以始终检查(不信任),每次请求一次,从不(始终信任)。
这对任何人都不应该是新闻。
显然,ACF 和 Railo 将编译他们被要求处理的任何 .cfm 或 .cfc 文件,因此如果启用,这些文件将“最终”在受信任的缓存中。
如果您 cfinclude 一个文件 - 任何文件 - ACF 和 Railo 也会将其编译为 JVM 字节码(并在磁盘上创建一个 .class 文件,如果配置为这样做)。由于编译了包含的文件,因此它也将“结束”在受信任的缓存中。如果你包含一个 CSS 文件会发生什么?它被编译为字节码,将 CSS 文件的全部内容作为字符串输出到响应流。由于它是一个已编译的类,现在输出一个硬编码的字符串,如果您更改 CSS 源文件并启用了受信任的缓存,ACF 和 Railo 将信任类加载器中的内容而不重新编译它(假设“从不”检查源是管理员环境)。
您可以通过清除 cfclasses 文件夹、重新启动 CFML 引擎并运行代码来验证这一点。您将看到一个 .class 文件出现在您的 CSS 文件中(假设您已启用将类文件保存到磁盘)。
因此,cfinclude 强制编译“任何”文件,并且可信缓存的正常规则适用于加载到内存中的类。
我不再使用 ACF,所以我无法详细说明 .cfr 文件(Railo 不支持报告文件),但这很可能取决于 ACF 是否编译 .cfr 文件。它应该很容易验证(通过查看 cfclasses 文件夹)。