我正在使用 symfony 1.4、smarty 和 LAMP 我想知道在我的情况下什么是最好的优化方式。
我的电子邮件模板分为三个部分:
- 标题(静态)
- 正文(可以是静态的或可变的)
- 页脚(非静态,因为它有一个取消订阅链接,我知道要传递一个唯一的 ID)
邮件模板代码
~$commonheader
~$body
~footer
我为页眉页脚和正文使用了部分,这意味着永远邮件程序所有这些都将被解析。
我应该怎么做那个静态部分不应该一次又一次地解析
我正在使用 symfony 1.4、smarty 和 LAMP 我想知道在我的情况下什么是最好的优化方式。
我的电子邮件模板分为三个部分:
邮件模板代码
~$commonheader
~$body
~footer
我为页眉页脚和正文使用了部分,这意味着永远邮件程序所有这些都将被解析。
我应该怎么做那个静态部分不应该一次又一次地解析
您应该启用 smarty 缓存(参见http://www.smarty.net/docsv2/en/caching)并使用 insert 而不是 include。正如 smarty 文档所说:
模板的某些部分可能未缓存。如果您启用了缓存,则不会缓存 {insert} 标签。每次创建页面时,它们都会动态运行,即使在缓存页面中也是如此。这适用于横幅、民意调查、实时天气、搜索结果、用户反馈区域等。
因此,示例代码将是:
测试.php
<?
require_once("lib/smarty/Smarty.class.php");
$smarty = new Smarty();
$smarty->setTemplateDir( 'templates' );
$smarty->setCompileDir( 'templates_c' );
$smarty->setCacheDir( 'templates_cache' );
$smarty->setConfigDir( 'templates_config' );
$smarty->caching = 1;
$smarty->compile_check = true;
function insert_Body()
{
global $smarty;
ob_start();
$smarty->display("search.tpl");
$ret = ob_get_contents();
ob_end_clean();
return $ret;
}
$smarty->display("test.tpl");
测试.tpl
<h1>Smarty test</h1>
{insert name="body"}
<hr>
插入标记将在 php 文件中查找名为“insert_”的函数,后跟传递的名称。在这个例子中它是 insert_Body();
您还可以将变量传递给函数,例如要包含的文件名。来自 Smarty 文档(http://www.smarty.net/docsv2/en/language.function.insert.tpl)
{insert name="getBanner" lid=#banner_location_id# sid=#site_id#}
Smarty 会调用这个函数: insert_getBanner(array("lid" => "12345","sid" => "67890")); 并显示返回的结果来代替 {insert} 标记。
请注意,该值应由函数返回,但没有回显。这就是为什么我使用 ob_start() & ob_end_clean() 和 ob_get_contents()