2013-02-09 72 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); 
} 

这将消除文件访问,但您正在创建自己的模板标记语言。理想情况下,您的业务逻辑与显示/渲染分离。

相关问题