已解析模板的流式 HTTP 响应,包括循环

Stream HTTP response of parsed template including loops

我有一个包含数百万项的数据库。这些项目可通过网络界面导出。客户可以指定一个模板(字符串),其中包含关于如何导出数据的占位符。

由于数据集非常大,我无法在模板上执行简单的 search/replace 并将结果作为响应发送,因为这会耗尽我的记忆。所以我通过 Transfer-Encoding: chunked.

流式传输响应

模板可能如下所示:

Some static content at the beginning …

[foreach item]{item.id} {item.name}[/foreach]

Some static content in between the loops …

[foreach item]{item.id} {item.value}[/foreach]

Some static content at the end …

如何按顺序流式传输?如果只有一个 foreach 循环,我可以简单地将流式处理分为三个阶段:

  1. 在循环之前逐行流式传输内容。
  2. 遍历循环并逐行流式传输每个项目。
  3. 逐行循环后流式传输内容。

但是,模板可能包含 0..n 个 foreach 循环(基于相同的项目列表)。是否有正则表达式来提取所有循环和它们之间的内容,以便我可以遍历它们?

我通过将 foreach 块定义为分隔符来利用 preg_split() 将模板切割成可流式片段来解决此问题:

$segments = preg_split('@(\[foreach .+?\].*?\[/foreach\])@si', $template, NULL, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);

为了捕获 foreach 块,设置 PREG_SPLIT_DELIM_CAPTURE 也很重要。