如何将 Varnish ESI 与模块化 PHP 模板系统一起使用

How to use Varnish ESI with modular PHP templating system

我希望在数据 heavy/user-centric 网站中实施清漆。如何使用使用 php 包含 html 模板的系统设置 ESI?

我目前使用自定义 php 模板系统(类似于 MVC 设计模式),其工作方式如下:

发出页面请求 -> php 计算逻辑 -> php 包含 html 个模板页面并填写变量 -> 页面输出

我只见过主要用于 html 页面的 esi 标签,包括 php 片段。

喜欢下面的代码:

<HTML>
<BODY>
The time is: <esi:include src="/php-includes/date.php"/>
at this very moment.
</BODY>
</HTML>

但是反过来可以吗?例如php 个页面中的 esi 标签包含 html 个片段?

与此类似:

<?php
//logic here
$content = "this will be displayed on the content page"

include("templates/header.html.php"); //esi would go here since page is static content
include("templates/content.html.php"); //no esi here, since page is dynamic content
include("templates/footer.html.php"); //esi would go here since page is static content
?>

您只需为您的特定 MVC 实现创建一种 "ESI" 渲染器,如 /esi.php?template=foo,然后在内部类似:

... whatever you need to boostrap your app in order to render a template ....
include("templates/$template.html.php");
.... exit so no header/fooder stuff is rendered, only template HTML of interest

当然不是那么简单,但简而言之,也是类似的事情。

然后我会在每个模板文件上放置一些逻辑以发出 HTML(如果由 esi.php 呈现或者如果 ESI "feature" 处于禁用状态)或 <esi 仅标记。

所以例如 templates/header.html.php 可能有(伪代码):

if esi (detect by checking request_uri to be esi.php) then echo '<esi /esi.php?template=header?somevar-from-parent=...'; return
---existing code--