已解析模板的流式 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 循环,我可以简单地将流式处理分为三个阶段:
- 在循环之前逐行流式传输内容。
- 遍历循环并逐行流式传输每个项目。
- 逐行循环后流式传输内容。
但是,模板可能包含 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
也很重要。
我有一个包含数百万项的数据库。这些项目可通过网络界面导出。客户可以指定一个模板(字符串),其中包含关于如何导出数据的占位符。
由于数据集非常大,我无法在模板上执行简单的 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 循环,我可以简单地将流式处理分为三个阶段:
- 在循环之前逐行流式传输内容。
- 遍历循环并逐行流式传输每个项目。
- 逐行循环后流式传输内容。
但是,模板可能包含 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
也很重要。