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文件和其他任何PHP文件一样都是included,因此不需要为它们调用任何特殊的APC/OpCache。

在随后的请求中,Smarty将检查底层.tpl文件的时间戳是否发生了更改,如果发生了更改则重新编译;否则,它将只保留现有的PHP文件。这种行为可以关闭,例如在不应该编辑文件的生产服务器上(Smarty 2中也有此设置,这不是什么新鲜事)。

我不确定你所描述的手册编写过程试图达到什么目的;根据你的描述,这听起来只是在复制Smarty已经做的事情,但通过"预热缓存",每个模板的第一次点击会有一个小的提升。它当然与APC/OpCache的存在或不存在无关——这不会改变Smarty将东西编译成PHP的频率,只会改变PHP将PHP编译成"操作代码"的频率。

可能还有其他一些你没有发现/描述过的技巧,也可能是系统的前程序员不知道他们在做什么,也不知道复杂的事情。