【问题标题】:Php Partial Cachingphp部分缓存
【发布时间】:2012-04-02 08:59:52
【问题描述】:

我想部分缓存一些 php 文件。例如

<?
echo "<h1>",$anyPerdefinedVarible,"</h1>";
echo "time at linux is: ";
// satrt not been catched section
echo date();
//end of partial cach
echo "<div>goodbye $footerVar</div>";
?>

所以缓存的页面应该像 (cached.php)

<h1>This section is fixed today</h1>
<? echo date(); ?>
<div>goodbye please visit todays suggested website</div>

它可以通过模板完成,但我直接想要它。因为我想要替代解决方案。

【问题讨论】:

  • 生成这些行将比从缓存存储中获取 2 个键更快。尽量缓存数据库中的数据,不要浪费时间输出,这是模板引擎的事情。
  • 此代码仅作为示例。真正的代码非常复杂,需要一些 sql 查询。我尝试非常清楚地显示我的问题。我想知道PHP的缓存机制。
  • 嗯,这不仅与 PHP 有关,而且很常见。再次:缓存数据,从数据库中获取,不缓存输出。并尝试将 Twig 用于模板,它将打开您对从表示中分离数据的理解。
  • @OZ_ 这是所有编程语言的常见情况,但我比其他语言更了解 PHP 语言。我想将它用于灵活的模板。我需要包含在不同日期创建的多个部分的模板。

标签: php caching


【解决方案1】:

看php的ob_start(),它可以缓冲所有输出并保存。 http://php.net/manual/en/function.ob-start.php

补充: 查看http://www.php.net/manual/en/function.ob-start.php#106275 以获得您想要的功能:) 编辑: 这里有一个更简单的版本:http://www.php.net/manual/en/function.ob-start.php#88212 :)


这里有一些简单但有效的解决方案:

模板.php

<?php
    echo '<p>Now is: <?php echo date("l, j F Y, H:i:s"); ?> and the weather is <strong><?php echo $weather; ?></strong></p>';
    echo "<p>Template is: " . date("l, j F Y, H:i:s") . "</p>";
    sleep(2); // wait for 2 seconds, as you can tell the difference then :-)
?>

实际页面.php

<?php    
    function get_include_contents($filename) {
        if (is_file($filename)) {
            ob_start();
            include $filename;
            return ob_get_clean();
        }
        return false;
    }

    // Variables
    $weather = "fine";

    // Evaluate the template (do NOT use user input in the template, look at php manual why)
    eval("?>" . get_include_contents("template.php"));
?>

您可以将带有http://php.net/manual/en/function.file-put-contents.php 的template.php 或actualpage.php 的内容保存到某个文件中,例如cached.php。然后你可以让actualpage.php检查cached.php的日期,如果太旧,让它创建一个新的,或者如果足够年轻,只需回显actualpage.php或重新评估template.php而不重建模板。


cmets后,这里缓存模板:

<?php    
    function get_include_contents($filename) {
        if (is_file($filename)) {
            ob_start();
            include $filename;
            return ob_get_clean();
        }
        return false;
    }

    file_put_contents("cachedir/cache.php", get_include_contents("template.php"));

?>

要运行它,您可以直接运行缓存文件,也可以将它包含在其他页面上。喜欢:

<?php
    // Variables
    $weather = "fine";

    include("cachedir/cache.php");
?>

【讨论】:

  • 它很有用,但它确实缓存了页面的所有部分。我想缓存 php 输出的某些部分,而不是全部。
  • 你可以将它传递给一个函数,包括/要求它——它很灵活。当然,您可以自己将内容传递给缓存文件,然后查看 fopen() 和 fwrite() 函数 - 您仍然必须将内容传递给它们。您可以使用 filemtime() 检查文件的时间/日期,如果它过期,只需替换它。
  • 我想将它用于灵活的模板。我需要包含在不同日期创建的多个部分的模板。因此,我需要任何从缓存中忽略指定 php 代码部分的函数。
  • 那么做那个功能?你有它需要的所有信息,如果没有,请说。您可以创建一个函数 echoBuffer 而不是 echo "myVar";,因此将 echoBuffer("myVar"); 用于必须缓冲的内容并创建一个返回您需要的函数。 (在这种情况下应该返回一个(缓冲的)字符串“myVar”。你可以同时使用它们;比如回显、日期、其他函数等。
  • 您也可以简单地 echo '&lt;?php' . date() . '?&gt;'; 到您的新模板文件,也许这就是您要找的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-18
  • 2015-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多