【问题标题】:Stream HTTP response of parsed template including loops解析模板的流式 HTTP 响应,包括循环
【发布时间】:2017-02-01 09:52:50
【问题描述】:

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

由于数据集非常大,我无法在模板上进行简单的搜索/替换并将结果作为响应发送,因为这会消耗我的记忆。所以我通过 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 循环(基于相同的项目列表)。是否有一个正则表达式可以提取所有循环及其之间的内容,以便我可以迭代它们?

【问题讨论】:

    标签: php regex streaming


    【解决方案1】:

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

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

    设置 PREG_SPLIT_DELIM_CAPTURE 也很重要,以便捕获 foreach 块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-08
      • 2021-09-28
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多