3

使用 PHP,我正在渲染一个看起来像这样的 HTML 表:

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

代码是这样工作的(精简版!在这个例子中没有theadtbody):

<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 就不必一遍又一遍地主动包含实际文件,而是从其缓存中获取它?这样的事情可能吗?

或者有没有更好的选择?

4

5 回答 5

1

您可以将所有操作(功能)放在一个文件中并包含该文件一次。只是在循环中,您将根据名称调用不同的函数。变量函数示例

于 2013-02-09T13:06:09.837 回答
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);
}

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

于 2013-02-09T13:54:02.220 回答
0

由于您在转到该页面时正在编辑或删除,因此每次再次打开该表时,表似乎都可能发生变化(几乎...),因此缓存可能不是最佳选择。

另一种方法是使用分页并添加“全部显示”按钮,以便仅在您真正需要时生成完整的表格。

于 2013-02-09T13:09:31.873 回答
0

您的动作渲染器似乎有问题。
它们只是不能那么大,无法放入单独的文件中。要呈现一个简单的超链接,只需要模板中的一行 HTML 代码。
如果这些渲染器中有太多逻辑,则必须将其移至业务逻辑部分。

分页肯定也有帮助。我的意思是真正的分页,每次调用只处理 100 条记录,而不是全部 1000 条,其中 900 条要隐藏。

于 2013-02-09T13:21:54.623 回答
-1

include_once() 可能是您正在寻找的。这是一个链接: http: //php.net/manual/en/function.include-once.php

于 2013-02-09T13:25:11.610 回答