PHP是否包含资源昂贵(特别是在迭代期间)?

时间:2011-06-23 16:56:58

标签: php loops include

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

[foreach answer] [include answer.tpl.php] [/foreach]

这需要包括answer.tpl.php数百次。

是否缓存?它会对性能有影响吗? 这被认为是一种好习惯吗?坏?

回应@Aaron Murray回答

不,那不行。仅_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;

3 个答案:

答案 0 :(得分:7)

  

PHP是否缓存include个请求?

据我所知,PHP默认不缓存包含。但您的底层文件系统可能会这样做。因此,在你的例子中一遍又一遍地访问同一个文件应该是非常快的。

如果遇到实际问题,首先需要对应用程序进行概要分析,以找出实际瓶颈所在。因此,除非您没有遇到任何问题,否则我会考虑使用包含无害。

关于良好做法,我认为在本文中对此进行了很好的解释:When Flat PHP meets Symfony

使您的代码更具可重用性

这不是高设计,只是为了展示如何开始使模块更加模块化的图片。您应该能够从包含文件中获取代码1:1,只需注意所有需要的模板变量都会传递给函数(不要使用全局变量,它迟早会阻挡你的方式):

# 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;

答案 1 :(得分:5)

您是否考虑过:

require_once('answer.tpl.php')
or
include_once('answer.tpl.php')

当然,您可以将“必需”文件仅包含在您希望它们包含的脚本中(仅限于它们确实需要的位置)。

修改:修改后的答案:

index.php - &gt;

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

answer.php - &gt;

function answer() {
    return '<div>This is the answer</div>';
}

另外在旁注中你可以在你的函数中使用输出缓冲来捕获你的answer.php中的HTML(稍微清晰的分离HTML和php的方法)。

回应上面的例子:

的index.php

<?php
require_once('test.php');
$array  = array('a', 'b', 'c');
$output = '';
foreach($array as $e)
{
    $output .= test($e);
}
echo $output;

test.php的

<?php
    function test($param) {
    return $param;
}

答案 2 :(得分:2)

此主题之前出现过,所以这里有一些可能的重复(不支持任何;大部分是部分答案,但仍然是相关的阅读):

嗯,这些都没有具体回答你的问题。我们在某个地方有一点性能基准,但我找不到它。

(就我个人而言,我经常将我的代码整理成将整个应用程序合并到一个blob文件中,然后剥离空白,以避免多个文件访问,即使APC在那里也是如此。)