PHP /输出缓冲性能的简单模板

时间:2017-04-27 12:11:24

标签: php buffer template-engine ob-start

我在我的脚本中使用非常简单的模板引擎:

<?php
require_once('some_class.php');
$some_class = new some_class();

function view($file, $vars) {
    ob_start();
    extract($vars);
    include dirname(__FILE__) . '/' . $file . '.php';
    $buffer = ob_get_contents();
    ob_end_clean();
    return $buffer;
}

echo view('template', array(
    'content' => some_class::content(),
    'pages' => some_class::pages(),
    'meta_title' => some_class::$meta_title,
    'meta_description' => some_class::$meta_description
));
?>

它运行良好,但我的脚本变大了,我正在添加新功能,有时在某些情况下需要花费很多时间来加载页面。我的网页有时需要使用外部API,并且有延迟。如何在没有输出缓冲的情况下重建它?

1 个答案:

答案 0 :(得分:1)

我认为没有理由使用输出缓冲。

<?php
require_once('some_class.php');
$some_class = new some_class();

function view($file, $vars) {
    extract($vars);
    include dirname(__FILE__) . '/' . $file . '.php';
}

view('template', array(
    'content' => some_class::content(),
    'pages' => some_class::pages(),
    'meta_title' => some_class::$meta_title,
    'meta_description' => some_class::$meta_description
));
?>

没有缓冲区,这也是一样的。如果您需要将渲染的模板作为字符串(可能只在代码中的一个位置发生),您只能在那里使用输出缓冲:

ob_start();
view('template', array(
    'content' => some_class::content(),
    'pages' => some_class::pages(),
    'meta_title' => some_class::$meta_title,
    'meta_description' => some_class::$meta_description
));
$buffer = ob_get_contents();
ob_end_clean();

如果您需要更频繁地将模板作为字符串,请将此逻辑包装在另一个函数中:

function render($file, $vars) {
    ob_start();
    view($file, $vars);
    $buffer = ob_get_contents();
    ob_end_clean();

    return $buffer;
}