2016-09-23 59 views
0

我有一個包含數百萬個項目的數據庫。這些項目可通過網絡界面導出。客戶可以用佔位符指定一個模板(字符串),以便如何導出數據。解析後的模板包含循環的HTTP HTTP響應

由於數據集非常大,我無法在模板上進行簡單的搜索/替換並將結果作爲響應發送,因爲這會消耗我的記憶。所以我通過Transfer-Encoding傳輸響應:分塊。

模板可能看起來像這樣:

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循環(基於相同的項目列表)。是否有正則表達式提取所有循環和它們之間的內容,所以我可以遍歷它們?

回答

0

我解決它利用preg_split()定義的foreach塊作爲分隔符切流能件模板:

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

設置PREG_SPLIT_DELIM_CAPTURE爲了捕捉在foreach塊,也很重要。