是PHP';包括资源昂贵(特别是在迭代期间)?

是PHP';包括资源昂贵(特别是在迭代期间)?,php,loops,include,Php,Loops,Include,PHP缓存是否包含请求?我想知道如何清理我的代码,并考虑使用更多的includes。考虑下面的方案。 [foreach answer] [include answer.tpl.php] [/foreach] 这需要包括answer.tpl.php数百次 它缓存吗?它对性能是否有值得考虑的影响? 这被认为是一种好的做法吗?糟糕 回应@Aaron Murray的回答 不,那不行。\u once的简单概念是防止多次包含同一文件。(防止因覆盖常量值等引起的错误) 实际示例如下所示: # index.p

PHP缓存
是否包含
请求?我想知道如何清理我的代码,并考虑使用更多的
includes
。考虑下面的方案。

[foreach answer] [include answer.tpl.php] [/foreach]
这需要包括
answer.tpl.php
数百次

它缓存吗?它对性能是否有值得考虑的影响? 这被认为是一种好的做法吗?糟糕

回应@Aaron Murray的回答

不,那不行。
\u once
的简单概念是防止多次包含同一文件。(防止因覆盖常量值等引起的错误)

实际示例如下所示:

# index.php
<?php
$array  = array('a', 'b', 'c');

$output = '';

foreach($array as $e)
{
    $output .= require_once 'test.php';
}

echo $output;

# test.php 
<?php
return $e;
#index.php
你有否考虑:

require_once('answer.tpl.php')
or
include_once('answer.tpl.php')
当然,您可以只在希望包含“必需”文件的脚本中包含这些文件(仅在真正需要它们的地方)

编辑:修改后的答案:

index.php->

require_once('answer.php');
echo answer(); // This function can be called from anywhere in the scripts.
answer.php->

function answer() {
    return '<div>This is the answer</div>';
}
函数应答(){
返回“这就是答案”;
}
另外,您还可以在函数中使用输出缓冲在answer.php中捕获HTML(用于分离HTML和php的稍微干净的方法)

针对您的上述示例:

index.php

PHP缓存
是否包含
请求

据我所知,PHP默认情况下不缓存include。但您的底层文件系统可能会这样做。因此,在您的示例中反复访问同一个文件应该非常快

如果遇到实际问题,首先需要分析应用程序以找出实际瓶颈所在。所以,除非你没有遇到任何问题,我会考虑使用不包括有害物质。< /P> 关于良好实践,我认为这在本文中得到了很好的解释:

使您的代码更易于重用 这不是一个很高的设计,它只是展示了如何开始使事情更加模块化。您应该能够从include文件中获取代码1:1,只需注意将所有需要的模板变量传递到函数中(不要为此使用globals,它迟早会妨碍您):


这个话题以前就提过,所以这里有一些潜在的重复(不支持任何答案;大部分是部分答案,但相关阅读):

好吧,这些都没有具体回答你的问题。我们在某处有一个小的性能基准,但我找不到


(就我个人而言,我经常组织我的代码,将整个应用程序合并到一个blob文件中,然后去除空白,以避免多个文件访问,即使有APC)

如果只包含一次,那么剩余的迭代将发生什么?
\u once
的概念是不允许多次包含相同的代码
require\u once()语句与require()相同,只是PHP将检查文件是否已包含,如果已包含,则不再包含(require)它。
PHP.net
在模板化的情况下,您可以将输出包装在函数或类中,然后对文件进行一次require\u,然后从多个位置调用它。例如,answer.tpl.php->
function answer(){echo'这是我的输出';}
并且在需要它的脚本中:
echo answer()
当然,您也可以将参数传递添加到您创建的函数/类中。因此,您可以在调用脚本的顶部要求它一次,并使该函数或类在整个执行过程中可用。文件的内容将由操作系统文件缓存缓存,但执行stat()仍会有开销调用等,查看自上次加载以来文件是否已更改。更不用说必须解析文件内容并计算其中的所有PHP代码(如果有)。
require\u once
没有返回值。这不是一个函数。操作系统可以很好地缓存隐含的文件请求。PHP本身没有。但这通常是不相关的,因为现在字节码缓存(APC)非常普遍。@mario:我确实使用APC。因此,如果APC正在使用,这就意味着
include
也会被缓存?谢谢你的回答。虽然,-1用于Symfony的参考链接和
afaik
。用一种糟糕的方式编写代码,并且只在代码出现故障(或者您开始遇到资源问题)时才进行修复,这通常是一个糟糕的建议。@Guy:链接的文章展示了一个总体情况。它并没有隐藏它是对symfony的,尽管如此,它还是一本不错的读物,不管是哪种框架。不要仅仅因为头衔而评判。第二点是,过早优化往往是问题的根源,而不是解决方案。在查看您的代码时,我会先考虑一些设计改进,然后再考虑磁盘I/O。因此,这不是一个忽略问题的建议,而是一个正确定位问题的建议。
<?php
require_once('test.php');
$array  = array('a', 'b', 'c');
$output = '';
foreach($array as $e)
{
    $output .= test($e);
}
echo $output;
<?php
    function test($param) {
    return $param;
}
# in your answer.tpl.php

function answer_template(array $vars) {
    extract($vars);
    ... your template code ...
}

# your script

array  = array('a', 'b', 'c');

$output = '';

require('answer.tpl.php');

foreach($array as $e)
{
    $output .= answer_template(compact('e'));
}

echo $output;