我正在使用Smarty处理一个旧的遗留PHP应用程序。我不熟悉Smarty。因此我的问题。
我知道Smarty模板已编译成PHP。然后,使用一些数据调用它们以生成输出。生成的PHP将作为此过程的一部分进行编译。
APC(和其他缓存解决方案)避免在用户请求之间重新编译PHP。
i)如果我用原始模板调用Smarty,它会首先将其编译为PHP,然后再编译为操作码,对吗?
ii)如果在我的PHP应用程序中启用了像APC这样的缓存系统,并且过去已经调用过(即编译过)模板:
a)Smarty是否足够聪明,不能在每次用户请求时将模板重新编译为PHP?
b)编译后的模板PHP的操作码是否可以通过APC重复使用?
为什么我会问这些问题?这个遗留应用程序很久以前就已经实现了(2010年之前的某些部分)。他们已经实现了所有Smarty模板的预编译系统,并将它们复制到应用程序的某个目录中,以直接调用生成的PHP代码。
我相信它在性能方面可能有意义,但现在,由于操作码缓存解决方案仍然可用,它仍然有意义吗?我们可以摆脱这个预编译过程吗?
答案 0 :(得分:2)
Smarty在首次使用时将所有.tpl
文件编译成PHP,并将结果放在已配置的缓存目录中。这些PHP文件就像include
一样,就像任何其他PHP文件一样,因此没有什么特别的APC / OpCache需要为它们调用。
在后续请求中,Smarty将检查基础.tpl
文件的时间戳是否已更改,如果有,则重新编译;否则,它将保留现有的PHP文件。此行为can be turned off, e.g. on a production server where files should not be edited(此设置为was available in Smarty 2 as well,它不是什么新鲜事。)
我不确定您描述的手动编译过程试图实现的目标;从你的描述中听起来只是复制Smarty已经做过的事情,但是对于每个模板的第一次点击有一点小的提升,加热缓存"。它肯定与APC / OpCache的存在与否无关 - 这不会改变Smarty将事物编译成PHP的频率,只会改变PHP将PHP编译成"操作码的频率。
可能还有一些其他技巧正在使用中,您无法发现/描述,或者系统的前任程序员可能不知道他们在做什么以及过于复杂的事情。 / p>