2009-06-03 109 views
0

因此,在工作中,我们有一个本土模板系统,重量轻,迄今为止对我们非常有用。PHP模板循环结果

我们碰到的墙是我们希望能够在一个模板上循环。用例就像搜索结果。我们正在想方法,我们可以做到这一点。我们现在已经提出了三种方法。首先是将旧的html存储在循环中,然后遍历它并使用concat将变量放入html中。我们认为的第二种方式是反复包括一个文件。第三种方法是将文件包含一次,使用输出buffereing来捕获它的输出,将文本echo添加到它,然后使用eval(我的老板希望我们想出创造性的方法)。我很喜欢包含重复的方法,因为它允许我们将html从逻辑中完全分离出来,eval方法也可以做到这一点,但它看起来更加骇人听闻,我们在这方面做了一些时间测试,发现在循环中使用html(方法一)最快,然后是eval方法,最后包含多次,其中包含实际上比eval方法慢了5-6倍。包括文件/评估文件1000次,并做了100次,并取其平均值得到我们的结果)

有什么办法可以加速多重包含? (看起来,我们每次做的包括PHP是再次击中文件系统。)

或者有没有人有办法完成这种类型的东西?

+0

这似乎是一个自然的使用的sprintf - 格式化和语法的sprintf模板(%S, %d等),执行file_get_contents()来获取格式化的html块,然后发送e变量。 – artlung 2009-06-03 22:08:27

+0

PHP参考:http://php.net/sprintf – artlung 2009-06-03 22:08:42

+0

@artlung:Ew,sprintf很丑!你为什么想这么做? – 2009-06-03 22:09:58

回答

0

缓存最终页面。我的意思是把所有的“块”(循环,块,不管你想叫它们)加入到你的缓存中的一个PHP文件中,然后把它包括进去。这样,你只需要每次请求一次而不是25次就可以访问文件系统。

0

老问题,我知道。

无论如何,我会建议在模板内部有一个简单的for或foreach循环。没有什么不妥。首先,由于遍历某些表示代码仍然是我眼中的表示逻辑(因为这也使得更容易将输出从列输出更改为行输出 - 例如愚蠢的例子)。其次,PHP仍然是一种模板语言。在模板中使用一些简单的控制结构没有任何问题。使用像Smartys这样的系统只是增加了另一层抽象(用另一种语法来学习),它具有PHP的许多功能(因此产生了相当多的开销)。这在我眼中是无稽之谈(在旁注中:对我来说那就是inner-platform effect,反模式)。

2

正如您的测试所示,优化脚本的最佳方法是将已包含的HTML代码循环到脚本中。

的影响时间来自:

  • 的eval()调用PHP解析器来验证码
  • 包括()使用磁盘访问

每一个包括(),然后降级性能阅读未更改文件的磁盘。():intial-parser + [disk-access + parser] * N个循环;如果你想要优化磁盘访问,你可以使用eval()选项:

  • include
  • 的eval():初始解析器+磁盘访问+解析器* N循环
  • 内嵌HTML:初始解析器

为了保持代码干净,你可以创建一个包含HTML功能,使用全局变量,或包含要显示到HTML所需的所有数据的单个对象或数组变量,像

function html_comment ($comment) 
{ 
    //global $comment; 

    ?> 
    <div class="comment"> 
     <div class="author"><?php echo $comment['author'] ?></div> 
     <div class="date"><?php echo $comment['date'] ?></div> 
     <div class="date"><?php echo $comment['content'] ?></div> 
    </div> 
    <?php 
} 

... 
foreach ($comments as $comment) 
    html_comment($comment);