2013-02-09 25 views
3

用PHP即時渲染它看起來有點像這樣的HTML表:緩存包含或必需的文件,以便它可以反覆使用?

-------------------------------------------------- 
| title | description   | actions  | 
-------------------------------------------------| 
| title1 | desc1    | edit/delete | 
| title2 | desc2    | edit/delete | 
| title3 | desc3    | edit/delete | 
| title4 | desc4    | edit/delete | 
-------------------------------------------------- 

的代碼是這樣的(!精簡版沒有theadtbody等在此examle):

<table> 
    <?php foreach ($tableData as $row): ?> 
    <tr> 

    <!-- Render columns (title, description) 
    <?php foreach ($columnData as $column): ?> 
    <td> 
     <?= $row[$column['name']]; ?> 
    </td> 
    <?php endforeach; ?> 

    <!-- Render actions --> 
    <?php foreach ($actions as $action): ?> 
    <td> 
     <?= include($action); // include the proper action button! ?> 
    </td> 
    <? endforeach; ?> 

    </tr> 
    <?php endforeach; ?> 
</table> 

這給了我想要的結果。但我只有一個問題。當我有1000多條記錄時,它會變得很慢。我已經注意到這是因爲我爲每個表格行都做了include。當我刪除include時,一切運行速度非常快。

included文件包含一些PHP邏輯。所以我不能只做一個file_get_contents。那麼,我可以,但是我必須使用eval()來解析內容。但我寧願不使用該功能。

所以,現在我想知道是否有可能以某種方式緩存包含的文件?所以PHP不會主動地一遍又一遍地包含實際的文件,而是從緩存中獲取它?是這樣的可能嗎?

或者有沒有更好的選擇?

回答

1

您可以將所有動作(函數)放在一個文件中幷包含該文件一次。在循環中,您將根據名稱調用不同的功能。 Variable function example

+0

Thamks,沒有想到這一點,但這可能是最好的方法。現在去看看它。 – Vivendi 2013-02-09 13:51:45

0

由於您在進入該頁面時正在編輯或刪除,因此每次再次打開表格時,表格可能會發生變化(幾乎...),因此緩存可能不是最佳選擇。

另一種方法是使用分頁並添加一個「全部顯示」按鈕,以便在您真正需要時纔會生成完整表格。

+0

我其實是指緩存'included'文件。所以'edit'按鈕和'delete'按鈕(兩個單獨的文件)應該被緩存。但也可能有其他按鈕,因爲它們充當某種插件機制。我在那裏也有一個Ajax分頁。問題在於客戶有時想查看(並打印)500多條記錄。所以在這一點上分頁並沒有真正的幫助。 – Vivendi 2013-02-09 13:16:59

+1

@Vivendi對不起,我誤解了你的問題。我會去#revoua的答案,然後包含函數,並用不同的行ID來調用它們來生成你的html。 – jeroen 2013-02-09 13:20:00

0

看起來你的動作渲染器有問題。
他們只是不能被放在不同的文件中。 要呈現一個簡單的超鏈接,模板中只需要一行HTML代碼。
如果你在這些渲染器中有太多的邏輯,你必須將它移動到業務邏輯部分。

分頁也肯定幫助。真正的分頁我的意思是,當每個通話只處理100條記錄時,並非全部都是1000條,其中900條被隱藏。

0

一種選擇是去「模板」路線。從文件中除去所有的PHP,並用「標籤」替換數據部分。然後你加載文件一次(file_get_contents)並用數據替換標籤。

//template.html 
Replace this template {variable} with {search} and {replace}. 
{conditional_html} 

//template.php 
$tpl = file_get_contents('template.html'); 
$output = ''; 
foreach($record as $r) { 
    $data = array('{variable}'=>$r['field1'], 
     '{search}'=>$r['field2'], 
     '{replace}'=>$r['field3'], 
     '{contional_html}'=>($r['field4']='1A' ? 'Display Conditional' : '') }; 
    $output .= str_replace(array_keys($data), $data, $tpl); 
} 

這將消除文件訪問,但您正在創建自己的模板標記語言。理想情況下,您的業務邏輯與顯示/渲染分離。

相關問題