加载/包含PHP模板的最快方法?

时间:2009-09-10 17:42:49

标签: php include

我有一个函数可以循环从MySQL中提取的不同类型的列表,并将它们显示为Facebook风格的“提要”。每种类型的商品都有不同的外观,因此需要不同的模板。

以下功能示例可能被调用100次(如果有100个列表):

function display_listing($id,$type) {
    global $abs_path;

    switch($type) {

        case 'photo':
            include($abs_path . '/templates/photo.php');
            break;

        case 'video':
            include($abs_path . '/templates/video.php');
            break;

    }

}

有没有更好的方法来做到这一点,我不会最终得到100个包含 - 这可能会减慢我的进程速度?我可以以某种方式在页面上保存一次包含,并根据需要多次引用它吗?

......或者这是最好的做法吗?

此外,我想知道如何在没有模板引擎的情况下自行完成此操作......

编辑:问题不仅仅是由include_once解决(我不相信)......我需要能够多次重用包含的文件,每次都替换变量。

6 个答案:

答案 0 :(得分:2)

虽然交换机不是编写此代码的最具扩展性的方式,但我担心包含是将模板保存在单独文件中的唯一方法。

可以想象,您可以将每个模板的代码封装在一个函数中,但是:

/*
photoTemplate.php
*/

<?php
function loadPhotoTemplate($id) {
?>
  <div id="photo">
...
  </div>
<?php
}
?>


/*
listing.php
*/

function display_listing($id,$type) {
    global $abs_path;

    switch($type) {

        case 'photo':
            include_once($abs_path . '/templates/photo.php');
            loadPhotoTemplate($id);
            break;

        case 'video':
            include_once($abs_path . '/templates/video.php');
            loadVideoTemplate($id);
            break;
    }

}

这将最多加载每个模板文件一次,然后每次要显示包含该项目特定数据的模板时调用该函数。

修改

最好在开头包含所有模板文件,然后只需在交换机中调用相应的函数即可。 PHP的* _once()函数很慢,因为每次调用它们时都必须查阅以前包含/必需的文件列表。

答案 1 :(得分:1)

创建一组允许的模板。你有功能看看请求的模板是否在数组中。如果是,则使用$ type变量来包含该文件。是的,一般情况下,您不应该在包含文件名中使用用户提供的数据,但是因为您已经根据已知良好的数组值对其进行了验证,所以它是安全的。

答案 2 :(得分:1)

如果你担心的是表现,我个人根本不会进入这个循环。

假设列表中的项目比它们创建的频率更高,我会在创建项目时生成HTML,并将输出与数据一起存储在数据库中。 (或者在memcache或文件或其他地方 - 但生成并存储它。)

这样你就可以将这个逻辑移回到项目的创建过程中,这样你就可以做同样的switch语句,但一次只能查找一个项目 - 你正在切断循环

然后在显示时间,您只需回显已存储的HTML,而不是调用display_listing()

答案 3 :(得分:1)

我认为你应该看一些事情。首先,是否有可能会包含相同的“模板”100次?这似乎是放在页面上的大量内容。

如果我使用微小的“片段” - 比如一个重复多次的表格行 - 我倾向于使用一个返回字符串的函数,如下所示:

/* snippets.php */
function tableRow( $row )
{
    return
        '<tr><td>' . $row['var1'] . '</td>' .
        '<td>' . $row['var2'] . '</td></tr>';
}

/* main page/view */
foreach ( $data as $row )
    echo tableRow( $row );

这里的主要优点是你可以在函数中使用循环和所有排序。

如果您正在寻找直接变量替换,您可以在HTML文件中创建自己的迷你模板;类似的东西:

<p>{name}<br />
  Posted {date} by {author}</p>

然后读入模板,将整个字符串传递给display_listing函数,该函数在所有{variables}上运行str_replace。我不认为会有太多的性能损失,但你必须尝试它才能确定。

答案 4 :(得分:0)

您想使用include_once功能代替include

  

include_once()语句包括   并评估指定的文件   在执行脚本期间。   这是一种类似的行为   include()语句,只有   不同的是,如果代码来自   它已包含一个文件   将不再包括在内。作为   顾名思义,它将被包括在内   只有一次。

答案 5 :(得分:0)

如果您要使用不同关键字的开关包含模板,那么您应该在交换机中设置一个变量,比如说$ template_filename,然后在您退出交换机后,像这样执行包含:< / p>

include_once("/templates/{$filename}.php");

如果您根本不想使用包含,那么您也可以使用模板引擎...

然而,这种方法对我来说似乎是合理的。