【问题标题】:Caching HTML output with PHP使用 PHP 缓存 HTML 输出
【发布时间】:2010-09-26 05:32:21
【问题描述】:

我想在我的网站上为我的 php 页面创建一个缓存。我确实找到了太多解决方案,但我想要的是一个可以从我的数据库生成 HTML 页面的脚本:

我有一个类别页面,它从数据库中获取所有类别,因此脚本应该能够生成一个 HTML 页面:my-categories.html。那么如果我选择一个类别,我应该得到一个 my-x-category.html 页面,以此类推其他类别和子类别。

我可以看到一些网站的 URL 如下:www.the-web-site.com/the-page-ex.html

即使它们是动态的。

非常感谢您的帮助

【问题讨论】:

  • 我认为您的问题需要澄清一下:您是否希望在内存中创建数据库中常用资源的缓存,或者您是否正在寻找如何从数据库中的信息动态创建页面?

标签: php html caching


【解决方案1】:

我使用APC 进行所有 PHP 缓存(在 Apache 服务器上)

【讨论】:

    【解决方案2】:

    检查 ob_start() 函数

    ob_start();
    echo 'some_output';
    $content = ob_get_contents();
    ob_end_clean();
    
    echo 'Content generated :'.$content;
    

    【讨论】:

      【解决方案3】:

      您可以使用 URL 重写来获得类似的 URL。例如:对于 apache,请参阅 mod_rewrite

      http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html

      您实际上不需要创建文件。您可以创建文件,但它更复杂,因为如果数据发生更改,您需要决定何时更新它们。

      【讨论】:

      • 但是取决于你的主机有多棒或有多蹩脚,你可能会也可能不会访问 URL 重写......我知道我的 1&1 Beginner 包,我没有:(
      • 这里的帖子很旧,但我想澄清一下。 1&1 初学者包确实允许 mod_rewrite——至少从 2007 年我第一次注册 1&1 开始。
      【解决方案4】:

      手动缓存(创建 HTML 并将其保存到文件中)可能不是最有效的方法,但如果您想沿着这条路走,我推荐以下方法(从我编写的一个简单的测试应用程序中提取) :

      $cache_filename = basename($_SERVER['PHP_SELF']) . "?" . $_SERVER['QUERY_STRING'];
      $cache_limit_in_mins = 60 * 32; // this forms 32hrs
      // check if we have a cached file already
      if ( file_exists($cache_filename) )
      {
          $secs_in_min = 60;
          $diff_in_secs = (time() - ($secs_in_min * $cache_limit_in_mins)) - filemtime($cache_filename);
          // check if the cached file is older than our limit
          if ( $diff_in_secs < 0 )
          {
              // it isn't, so display it to the user and stop
              print file_get_contents($cache_filename);
              exit();
          }
      }
      
      // create an array to hold your HTML output, this is where you generate your HTML
      $output = array();
      $output[] = '<table>';
      $output[] = '<tr>';
      // etc
      
      //  Save the output as manual cache
      $file = fopen ( $cache_filename, 'w' );
      fwrite ( $file, implode($output,'') );
      fclose ( $file );
      
      print implode($output,'');
      

      【讨论】:

      • 如果您在代码中使用 setlocale,那么在创建缓存文件名时需要考虑这一点 - 否则您最终会为所有语言环境提供相同的版本。
      【解决方案5】:

      如果您不反对框架,请尝试使用 Zend 框架的Zend_Cache。它非常灵活,并且(与某些框架模块不同)易于实现。

      【讨论】:

        【解决方案6】:

        【讨论】:

          【解决方案7】:

          我是从加载数据库的角度考虑的,并按数据带宽和加载速度收费。我有一些多年来不太可能改变的页面,(我知道使用基于数据库的 CMS 系统很容易)。与美国不同,这里的带宽成本可能很高。任何人对此都有任何看法,无论是创建 htmal 页面还是动态(php、asp.net) 无论如何,页面的链接都将存储在数据库中。

          【讨论】:

            【解决方案8】:

            在我看来,这是最好的解决方案。我将它用于我的 Android 应用程序的缓存 JSON 文件。它可以简单地用于其他 PHP 文件。 将文件大小从 ~1mb 优化到 ~163kb (gzip)

            在您的目录中创建cache 文件夹

            然后创建cache_start.php文件并粘贴这段代码

            <?php
            header("HTTP/1.1 200 OK");
            //header("Content-Type: application/json"); 
            header("Content-Encoding: gzip");
            
            $cache_filename = basename($_SERVER['PHP_SELF']) . "?" . $_SERVER['QUERY_STRING'];
            $cache_filename = "./cache/".md5($cache_filename);
            $cache_limit_in_mins = 60 * 60; // It's one hour
            
            
            if (file_exists($cache_filename))
            {
                $secs_in_min = 60;
                $diff_in_secs = (time() - ($secs_in_min * $cache_limit_in_mins)) - filemtime($cache_filename);
                if ( $diff_in_secs < 0 )
                {
                    print file_get_contents($cache_filename);
                    exit();
                }
            }
            ob_start("ob_gzhandler");
            ?>
            

            创建cache_end.php 并粘贴此代码

            <?php
            $content = ob_get_contents();
            ob_end_clean();
            $file = fopen ( $cache_filename, 'w' );
            fwrite ( $file, $content );
            fclose ( $file );
            echo gzencode($content);
            ?>
            

            然后创建例如index.php(您要缓存的文件)

            <?php
            include "cache_start.php";
            echo "Hello Compress Cache World!";
            include "cache_end.php";
            ?>
            

            【讨论】:

            • 如果您在代码中使用 setlocale,那么在创建缓存文件名时需要考虑这一点 - 否则您最终会为所有语言环境提供相同的版本。
            猜你喜欢
            • 1970-01-01
            • 2011-10-13
            • 2016-10-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-26
            • 2010-12-13
            • 2012-07-09
            相关资源
            最近更新 更多