Smarty 使用 APC(或其他缓存解决方案)吗?

Does Smarty use APC (or other cache solutions)?

我正在使用 Smarty 开发旧版 PHP 应用程序。我对Smarty不熟悉。因此我的问题。

我了解到 Smarty 模板被编译成 PHP。然后,使用一些数据调用它们以生成输出。生成的 PHP 作为此过程的一部分进行编译。

APC(和其他缓存解决方案)避免在用户请求之间重新编译 PHP。

i) 如果我用原始模板调用 Smarty,它会先将其编译成 PHP,然后再编译成操作码,对吗?

ii) 如果在我的 PHP 应用程序中启用了像 APC 这样的缓存系统,并且如果模板在过去已经被调用(即编译):

a) Smarty 是否足够聪明,不会在每次用户请求时将模板重新编译为 PHP?

b) 编译模板的操作码 PHP 是否会通过 APC 重新使用?

我为什么要问这些问题?这个遗留应用程序很久以前就已经实现了(2010 年之前的某些部分)。他们已经实现了所有 Smarty 模板的预编译系统,并将它们复制到应用程序的某个目录中以直接调用生成的 PHP 代码。

我相信它在当时对性能有意义,但现在,由于操作码缓存解决方案仍然可用,它仍然有意义吗?我们可以去掉这个预编译过程吗?

Smarty 在第一次使用时将所有 .tpl 文件编译成 PHP,并将结果放在配置的缓存目录中。这些 PHP 文件然后 included 就像任何其他 PHP 文件一样,因此没有什么特别的 APC/OpCache 需要为它们调用。

在后续请求中,Smarty 将检查底层 .tpl 文件的时间戳是否已更改,如果已更改则重新编译;否则,它只会保留现有的 PHP 文件。这种行为can be turned off, e.g. on a production server where files should not be edited (this setting was available in Smarty 2 as well,并不是什么新鲜事。

我不确定您描述的手动编译过程试图实现什么;根据您的描述,这听起来只是在复制 Smarty 已经做的事情,但是 "warming the cache" 对每个模板的第一次点击有小幅提升。它当然与 APC/OpCache 的存在与否无关 - 这不会改变 Smarty 将事物编译成 PHP 的频率,只会改变 PHP 将 PHP 编译成的频率"op codes".

可能使用了一些您没有发现/描述的其他技巧,或者可能是系统的前任程序员不知道他们在做什么,并且把事情搞得太复杂了。